Представления на основе классов Django YearArchiveView - PullRequest
2 голосов
/ 20 апреля 2011

Я пробую основанные на классах представления Джанго, и мне они пока нравятся, но я не могу заставить YearArchiveView дать мне что-нибудь.Вот мой класс:

class ThoughtsByYearView(YearArchiveView):
    template_name = "thoughts/index_by_year.html"
    queryset = Thought.objects.published()
    date_field = 'pub_date'
    context_object_name = 'thought_list'

и мои urls.py:

urlpatterns = patterns('thoughts.views',
    url(r'^$', ThoughtsIndexView.as_view(), name='thoughts'),
    url(r'^(?P<year>\d{4})/$', ThoughtsByYearView.as_view(), name='thoughts_year'),
)

оба thought_list и object_list возвращаются как пустые списки.Переопределение get_queryset также ни к чему не приведет.ThoughtsIndexView возвращает правильные объекты, поэтому я уверен, что это просто глупая ошибка, которую я совершаю.Может кто-нибудь сказать мне, что это такое?

О, и вот контрольный пример, который не проходит: (правка: результат в браузере тот же. Нет возврата)

def test_thoughts_by_year_has_thoughts(self):
    response = self.client.get(reverse('thoughts_year', args=[datetime.now().year]))
    thoughts_by_year = response.context_data['thought_list']
    self.assertGreater(len(thoughts_by_year), 0)

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Это было ошибкой новичка.Я не указывал make_object_list в классе.Вы можете увидеть, как это исправлено на этом коммите .

Из документации :

make_object_list

логическийуказание, следует ли получить полный список объектов за этот год и передать их в шаблон.Если True, список объектов будет доступен для контекста.По умолчанию это False.

Так что я не уверен, почему эта опция существует, но она существует.Для меня не имеет большого смысла ничего не возвращать по умолчанию (может быть, нумерация страниц?)

1 голос
/ 16 апреля 2012

Вы уже решили проблему, но чтобы ответить на вопрос о том, почему существует эта опция, в документации написано:

Страница годового архива, отображающая все доступные месяцы взаданный год.

... контекст шаблона будет иметь вид:

  • date_list: объект DateQuerySet, содержащий все месяцы, в которых имеются объекты, доступные в соответствии с набором запросов, представленные в виде объектов datetime.datetimeв порядке возрастания.

Представления на основе классов сложны, и стоит очень внимательно прочитать документацию, углубиться в источник (в основном django.views.generic) и ознакомиться с методы отладки , чтобы пройти через немного запутанную кучу наследования, происходящую с большинством представлений.

0 голосов
/ 04 мая 2011

Да. Я с тобой согласен. В настоящее время у меня есть своя собственная реализация этого общего представления на основе классов, но мне любопытно, является ли он «политкорректным». В любом случае, очень полезно узнать, как вы можете использовать этот общий вид, и я подумал, что этот (make_object_list) атрибут является доступной опцией для кодировщиков, с которыми можно возиться.

...