Вопрос по migration, generics, django, views – Переход от direct_to_template к новому TemplateView в Django

17

Я хочу обновить свой проект до последней версии django и обнаружил, что общие представления изменились совсем немного. Глядя на документацию, я вижу, что они изменили все общие элементы на представления на основе классов. Я понимаю использование по большей части, но смущен тем, что мне нужно делать при возврате большего количества объектов для представления. Текущий URL может выглядеть так:

(r'^$', direct_to_template, { 'template': 'index.html', 'extra_context': { 'form': CodeAddForm, 'topStores': get_topStores, 'newsStories': get_dealStories, 'latestCodes': get_latestCode, 'tags':get_topTags, 'bios':get_bios}},  'index'),

Как мне преобразовать что-то подобное в эти новые представления?

Ваш Ответ

2   ответа
4

используя подкласс DirectTemplateView. В частности, эта ошибка:

AttributeError at /pipe/data_browse/ 'DirectTemplateView' object has no attribute 'has_header' Request Method:  
  GET Request URL:  http://localhost:8000/pipe/data_browse/ Django Version: 1.5.2
  Exception Type:   AttributeError
  Exception Value:   'DirectTemplateView' object has no attribute 'has_header'
  Exception Location:   /Library/Python/2.7/site-packages/django/utils/cache.py in patch_vary_headers, line 142 
  Python Executable:    /usr/bin/python 
  Python Version:   2.7.2

То, что работало для меня, состояло в том, чтобы вместо этого преобразовать любую строку как это

return direct_to_template(request, 'template.html', {'foo':12, 'bar':13})

к этому:

return render_to_response('template.html', {'foo':12, 'bar':13}, context_instance=RequestContext(request))
Похоже, что ответ Pykler возвращает объект представления в промежуточное ПО, вызывая проблемы с некоторыми пользовательскими промежуточными программами, render_to_responce или render работает аналогично direct_to_template, возвращающему объект ответа. В настоящее время это выглядит как более обратно совместимый подход. Это также упрощает обновление Djano до версии 1.5 или 1.6 без необходимости преобразования всех ваших представлений в представления на основе классов.
29

Общие виды Миграция описывает, какой класс на основе заменяет что. Согласно документу, единственный способ передать extra_context - это создать подкласс TemplateView и предоставить собственный метод get_context_data. Вот класс DirectTemplateView, который я придумал, который позволяетextra_context как было сделано сdirect_to_template.


class DirectTemplateView(TemplateView):
    extra_context = None
    def get_context_data(self, **kwargs):
        context = super(self.__class__, self).get_context_data(**kwargs)
        if self.extra_context is not None:
            for key, value in self.extra_context.items():
                if callable(value):
                    context[key] = value()
                else:
                    context[key] = value
        return context

Используя этот класс, вы бы заменили:

(r'^$', direct_to_template, { 'template': 'index.html', 'extra_context': { 
    'form': CodeAddForm, 
    'topStores': get_topStores, 
    'newsStories': get_dealStories, 
    'latestCodes': get_latestCode, 
    'tags':get_topTags, 
    'bios':get_bios
}},  'index'),

с:

(r'^$', DirectTemplateView.as_view(template_name='index.html', extra_context={ 
    'form': CodeAddForm, 
    'topStores': get_topStores, 
    'newsStories': get_dealStories, 
    'latestCodes': get_latestCode, 
    'tags':get_topTags, 
    'bios':get_bios
}), 'index'),
Если я использую direct_to_template в представлении, каков синтаксис для вашего DirectTemplateView для следующего? вернуть direct_to_template (запрос, шаблон = "шаблон.html", дополнительный_контекст)
DirectTemplateView.as_view (template_name = & apos; template.html & apos ;, extra_context = extra_context)
Продолжение: я обнаружил, что преобразование direct_to_template в render_to_response работает лучше. Смотрите мой ответ ниже.
Я пробовал это, но получаю эту ошибку:AttributeError at /pipe/data_browse/ 'DirectTemplateView' object has no attribute 'has_header' Request Method: GET Request URL: http://localhost:8000/pipe/data_browse/ Django Version: 1.5.2 Exception Type: AttributeError Exception Value: 'DirectTemplateView' object has no attribute 'has_header' Exception Location: /Library/Python/2.7/site-packages/django/utils/cache.py in patch_vary_headers, line 142 Python Executable: /usr/bin/python Python Version: 2.7.2
Хорошо сделано! Я только что исправил форматирование URL в соответствии с PEP8

Похожие вопросы