2012-06-12 21 views
17

Estoy buscando actualizar mi proyecto a la última versión de django y he descubierto que las vistas genéricas han cambiado bastante. Al mirar la documentación, veo que cambiaron todo el material genérico por vistas basadas en clases. Entiendo el uso en su mayor parte, pero estoy confundido en cuanto a lo que debo hacer cuando devuelvo una mayor cantidad de objetos para una vista. Una URL actual podría verse así:Pasar de direct_to_template a la nueva TemplateView en Django

(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'), 

¿Cómo convierto algo así en estas nuevas vistas?

Respuesta

29

Generic Views Migration describe qué vista basada en clase reemplaza qué. De acuerdo con el documento, la única forma de pasar extra_context es crear una subclase de TemplateView y proporcionar su propio método get_context_data. Aquí está una clase DirectTemplateView que se me ocurrió que permite extra_context como se hizo con direct_to_template.

from django.views.generic import TemplateView 

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 

El uso de esta clase debería reemplazar:

(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'), 

con:

(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'), 
+1

si estoy usando direct_to_template en una vista ¿Cuál es la sintaxis de su DirectTemplateView para lo siguiente? retorno direct_to_template (solicitud, plantilla = 'template.html', extra_context) – mogga

+0

DirectTemplateView.as_view (template_name = 'template.html', extra_context = extra_context) – Pykler

+0

he probado esto, pero estoy recibiendo este error: 'AttributeError en/tubería/data_browse/ objeto 'DirectTemplateView' no tiene atributo 'has_header' Solicitud Método: \t GET URL de solicitud: \t http: // localhost: 8000/tubería/data_browse/ Django Versión: 1.5.2 \t Excepción Tipo: \t AttributeError Excepción Valor: \t objeto 'DirectTemplateView' no tiene ningún atributo 'has_header' Excepción Lugar: \t /Library/Python/2.7/site-packages/django/utils/cache.py en patch_vary_headers, línea 142 Python ejecutable: \t/usr/bin pitón Version/Python: \t 2.7.2' – mobopro

4

me encontré con un problema con la respuesta de Pykler usando la subclase DirectTemplateView. En concreto, este error:

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 

Lo que funcionó para mí era convertir cualquier lugar línea como la siguiente:

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

a esto:

return render_to_response('template.html', {'foo':12, 'bar':13}, context_instance=RequestContext(request)) 
+0

Parece que la respuesta de Pykler devuelve un objeto de vista al middleware que causa problemas con algún middleware personalizado, render_to_responce o render funciona de manera similar a direct_to_template devolver un objeto de respuesta. Por el momento, esto parece un enfoque más compatible con versiones anteriores. Esto también hace que sea super simple actualizar Djano a 1.5 o 1.6 sin tener que convertir todas sus vistas a vistas basadas en clases. – arctelix

Cuestiones relacionadas