Context * 3

14 views
Skip to first unread message

Malik Rumi

unread,
Dec 16, 2016, 1:02:25 PM12/16/16
to Django users

Greetings, sports fans.

There is an old saying, three strikes and you're out. They also say the third time is the charm. Let’s see which one this is for me, shall we?


This is the 3rd time in the last two years that I have been stuck for more than a few days on a problem getting my data onto a template. (I’m obviously not a full time developer). Although the symptom is the same, they do not all seem to be precisely the same cause, but I don’t think that matters. What matters here is that clearly, I just plain don’t understand context. It seems like a simple concept, but I can’t seem to execute it routinely and effectively.


Here’s my view:


#!/usr/bin/python
#-*- coding: utf-8 -*-

from django.shortcuts import render
from .models import Jurisdiction

def statehome(request, twodigit):
 state
= Jurisdiction.objects.all()
 ace
= 'spades'
 context
={'state':state, 'ace':ace}
 
return render (request, 'statehome.html', context)



Twodigit is just the postal code that I use in the url. Nothing related to state or jurisdiction displays on the template. I put ‘ace’ in there just as a test, and ‘spades’ shows up bright and bold just like it should. Here is the relevant portion of the template:


 <h2 class="title">{{state.name}}{{ ace }}</h2>


this is what I get in the shell:


In [23]: J=Jurisdiction.objects.all()

In [27]: for state in J:
 
...: print(state.name)
 
...:
United States of America
Alabama
Alaska
Arizona
...etc



It is not called for in this particular template, but I decided to put a for loop in there, too, just to test it:


{% for state in states %}

{{ state.name }}

{% endfor %}


You guessed it! Nothing.


According to Django Debug Toolbar, I have this context in my template:


{'ace': 'spades', 'state': '<<queryset of bench.Jurisdiction>>'}


But that same Toolbar also says I only executed two sql queries: one for the session and one for the user.


Earlier, I discovered that a queryset of one is not the same as a single object, and that it always helps to get the right name of your object:


In [3]: Jurisdiction.objects.filter(name="United States")

Out[3]: <QuerySet []>



In [5]: Jurisdiction.objects.get(name="United States")

DoesNotExist: Jurisdiction matching query does not exist.


In [6]: Jurisdiction.objects.get(name="United States of America")

Out[6]: <Jurisdiction: United States>


In [7]: us=Jurisdiction.objects.get(name="United States of America")


In [8]: us.name

Out[8]: 'United States of America'


So when I used ‘get’ instead of ‘filter’ in my view, it worked. But that does not solve my problem. What happens when I want a list of objects? Or several different objects and their attributes? Isn’t that supposed to be a queryset? Then how do I make them show up in the template? Why does my for loop and state.name work in the shell with objects.all(), but neither works in the template?


I don’t understand. I’m sure it is staring me right in the face, and is obvious to you, but I just plain don’t get it. So if I could get an explanation, and a how to, that would be great. And if you can point to a book, website, tutorial, whatever – not the official docs, thank you, I can recite them in my sleep and clearly I’m not getting it – that explains all this slowly, step by step, big picture and little picture, with examples and an explanation of vocabulary, that would be really great. Thanks.

Dylan Reinhold

unread,
Dec 16, 2016, 1:37:07 PM12/16/16
to django...@googlegroups.com
In your view you have state singular and in your template you are looping on states plural.

Dylan

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/11932523-c612-4938-bb27-0bd1527e3ed8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Malik Rumi

unread,
Dec 16, 2016, 5:40:55 PM12/16/16
to Django users
Dylan,

I would name my firstborn after you, but she's gotten used to her name already. ;-). THANK YOU!
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages