2012-06-12 15 views
17

Cercando di aggiornare il mio progetto all'ultima versione di Django e ho scoperto che le viste generiche sono cambiate un po '. Guardando la documentazione vedo che hanno cambiato tutte le cose generiche in viste basate su classi. Comprendo l'utilizzo per la maggior parte, ma sono confuso su cosa devo fare quando restituisco un numero maggiore di oggetti per una vista. Un URL corrente potrebbe essere simile a:Spostamento da direct_to_template a nuovo TemplateView in 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'), 

Come si converte qualcosa di simile in queste nuove visualizzazioni?

risposta

29

Generic Views Migration descrive quale vista basata sulla classe sostituisce cosa. Secondo il documento, l'unico modo per passare extra_context è sottoclasse TemplateView e fornire il proprio metodo get_context_data. Ecco una classe DirectTemplateView che ho trovato che consente di extra_context come è stato fatto 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 

Usando questa classe che si dovrebbe sostituire:

(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

se sto usando direct_to_template in vista qual è la sintassi per DirectTemplateView per quanto segue? return direct_to_template (request, template = 'template.html', extra_context) – mogga

+0

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

+0

Ho provato questo, ma sto ricevendo questo errore: 'AttributeError at/tubo/data_browse/ oggetto 'DirectTemplateView' non ha alcun attributo 'has_header' Richiesta Metodo: GET \t Richiesta URL: \t http: // localhost: 8000/tubo/data_browse/ Django Versione: 1.5.2 \t Tipo eccezione: \t AttributeError Valore eccezione: \t L'oggetto 'DirectTemplateView' non ha attributo 'has_header' Eccezione Località: \t /Library/Python/2.7/site-packages/django/utils/cache.py in patch_vary_headers, linea 142 Python eseguibile: \t/usr/bin/python Python Versione: \t 2.7.2' – mobopro

4

mi sono imbattuto in un problema con la risposta di Pykler utilizzando la sottoclasse DirectTemplateView. In particolare, questo errore:

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 

Quello che ha funzionato per me è stato quello di trasformare invece ogni riga come questa:

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

a questo:

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

Sembra che la risposta di Pykler restituisca un oggetto vista al middleware che causa problemi con alcuni middleware personalizzati, render_to_responce o render in modo simile a direct_to_template che restituisce un oggetto risposta. Per il momento questo sembra un approccio più retrocompatibile. Ciò semplifica inoltre l'aggiornamento di Djano a 1.5 o 1.6 senza dover convertire tutte le viste in viste basate su classi. – arctelix

Problemi correlati