开发者

Object_list always empty

the app is working this way. That i have a simple news adding model as below:

class News(models.Model):
    title = models.CharField(max_length=100)    
    publication_date = models.DateField(auto_now_add=True)
    content = models.TextField()

the view

def homepage(request):
  posts= News.objects.all() #.get(title="aaa")
  return render_to_response('homepage.html', {'a':posts})

and finally the tamplate:

{% for b in a.object_开发者_如何学JAVAlist %}
   <li> title:{{ b.title }}</li>
{%empty %}
   EMPTY
{% endfor %}

Unfortunately it always sais 'EMPTY'. However if i take the '.get(title="aaa")' option instead of '.all()' (the commented part) I got the right title and content of the message with title 'aaa'. Can anyone explain what am I doing wrong? Thanks in advance for Your expertise.

EDIT I'm sorry I didn't have written the template for the get option Well off course the 'get' verion of template differs. It looks like this:

 {{a.title}} {{a.content} 

And it works printing the expected title and message content So the 'get' works with the template and the 'for' didn't iterate over the QuerySet returned by all(). I am beginner but object_list is supposed to be the representation for querySet passed in render_on_request as a element of dictionary?


When you use get, the variable posts contains an instance of News. On the other hand, if you use .all(), posts will contain a queryset. So first I would suggest you use filter instead of get, so posts would always be a queryset, and therefore you wouldn't have such an inconsistent behaviour ...


When you want to iterate over something like this:

for object in object_list:
    print object

object_list needs to support iterating. list, tuple, dict, and other types support that. You can define your own iterator class by giving it a iter method. See the docs for that.

Now, in your example

return render_to_response('homepage.html', {'a':posts})

posts is a Queryset instance that supports iterating. Think of it this way:

{% for b in News.objects.all %}

this is what you would like to have, but what you actually did is this:

{% for b in News.objects.all.object_list %}

But News.objects.all does not have an object_list attribute!

News.objects.all is what your object_list should be, so just write:

{% for b in a %}


Please post the exact code you are running. There is no way that either of your alternatives would work with a.object_list, because there is no definition of object_list anywhere and it's not a built-in Django property.

And assuming you actually mean that for b in a doesn't work in the first code but does in the second, this is not true either, because with .get you won't have anything to iterate through with for.

However, let's assume what you actually did was pass the results of .all() to the template, and the template didn't have the for loop. That wouldn't work, because all() - like filter() - returns a QuerySet, which must be iterated through. For the same reason, get() wouldn't work with a for loop.

Edited after comment "object_list is supposed to be the representation for querySet passed in render_on_request " - no, it isn't. Where did you get that idea? If you pass a queryset called a to the template, then you iterate through a, nothing else. object_list is the name that is used by default in generic views for the queryset itself - ie what you have called a - but in your own views you call it what you like, and use it with the name you have given it.

Edited after second comment I don't know why this should be confusing. You've invented a need for object_list where there is no such variable, and no need for one. Just do as I said originally - {% for b in a %}.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜