Object_list всегда пуст - PullRequest
       2

Object_list всегда пуст

1 голос
/ 25 июля 2010

приложение работает таким образом.Что у меня есть простая модель добавления новостей, как показано ниже:

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

представление

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

и, наконец, шаблон:

{% for b in a.object_list %}
   <li> title:{{ b.title }}</li>
{%empty %}
   EMPTY
{% endfor %}

К сожалению, это всегда говоритEMPTY».Однако, если я выберу опцию «.get (title =" aaa ")» вместо «.all ()» (прокомментированная часть), я получу правильный заголовок и содержание сообщения с заголовком «aaa».Может кто-нибудь объяснить, что я делаю не так?Заранее благодарим за Ваш опыт.

РЕДАКТИРОВАТЬ Извините, я не написал шаблон для опции get. Конечно, версия шаблона get отличается.Выглядит это так:

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

И он работает с печатью ожидаемого заголовка и содержимого сообщения. Таким образом, метод «get» работает с шаблоном, а «for» не выполняет итерацию по QuerySet, возвращенному all ().,Я новичок, но object_list должен быть представлением для querySet, переданного в render_on_request как элемент словаря?

Ответы [ 3 ]

0 голосов
/ 25 июля 2010

Пожалуйста, напишите точный код, который вы используете. Ни одна из ваших альтернатив не будет работать с a.object_list, потому что нигде нет определения object_list и это не встроенное свойство Django.

И если предположить, что вы действительно имеете в виду, что for b in a не работает в первом коде, но работает во втором, это тоже не так, потому что с .get у вас не будет ничего для перебора с for .

Однако давайте предположим, что вы фактически передали шаблон .all() шаблону, и шаблон не имел цикла for. Это не сработает, потому что all() - как и filter() - возвращает QuerySet, который должен быть повторен. По той же причине get() не будет работать с a for loop.

Отредактировано после комментария"object_list должен быть представлением для querySet, переданного в render_on_request" - нет, это не так. Откуда у вас эта идея? Если вы передадите набор запросов с именем a в шаблон, то выполните итерацию по a, больше ничего. object_list - это имя, которое по умолчанию используется в общих представлениях для самого набора запросов - то есть того, что вы назвали a - но в своих собственных представлениях вы называете его тем, что вам нравится, и используете его с именем, которое вы ему дали .

Отредактировано после второго комментария Я не знаю, почему это должно сбивать с толку. Вы изобрели потребность в object_list, где такой переменной нет и она не нужна. Просто сделай, как я сказал изначально - {% for b in a %}.

0 голосов
/ 25 июля 2010

Если вы хотите перебрать что-то вроде этого:

for object in object_list:
    print object

object_list должен поддерживать перебор.списки, кортежи, dict и другие типы поддерживают это.Вы можете определить свой собственный класс итератора, присвоив ему метод iter .См. документы .

Теперь в вашем примере

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

posts - это экземпляр Queryset, который поддерживает итерации.Подумайте об этом так:

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

это то, что вы хотели бы иметь, но на самом деле вы сделали следующее:

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

Но News.objects.all не имеетатрибут object_list!

News.objects.all - это то, чем должен быть ваш object_list, поэтому просто напишите:

{% for b in a %}
0 голосов
/ 25 июля 2010

Когда вы используете get , переменная posts содержит экземпляр из News .С другой стороны, если вы используете .all () , posts будет содержать queryset .Поэтому сначала я бы предложил вам использовать filter вместо get , поэтому posts всегда будет набором запросов, и поэтому у вас не будет такого противоречивого поведения...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...