2012-06-12 10 views
17

Szukam aktualizacji mojego projektu do najnowszej wersji django i odkryłem, że ogólne widoki zmieniły się całkiem sporo. Patrząc na dokumentację widzę, że zmienili oni wszystkie ogólne rzeczy na widoki oparte na klasach. Rozumiem użycie w przeważającej części, ale jestem zdezorientowany co do tego, co muszę zrobić, gdy zwracam większą liczbę obiektów dla widoku. Aktualny adres URL może wyglądać następująco:Przejście z direct_to_template do nowego TemplateView w 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'), 

Jak przekonwertować coś takiego na nowe widoki?

Odpowiedz

29

Generic Views Migration opisuje, co widok oparty na klasie zastępuje co. Zgodnie z dokumentem jedynym sposobem przekazania extra_context jest podklasa TemplateView i dostarczenie własnej metody get_context_data. Oto klasa DirectTemplateView, którą wymyśliłem, która pozwala na extra_context, podobnie jak w przypadku 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 

Korzystanie z tej klasy należy zastąpić:

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

z:

(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

jeśli używam direct_to_template w widoku jaka jest składnia twojego DirectTemplateView dla następujących? powrót direct_to_template (request, template = 'template.html', extra_context) – mogga

+0

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

+0

Próbowałem tego, ale otrzymuję ten błąd: 'AttributeError w/rura/data_browse/ obiekt 'DirectTemplateView' nie ma atrybutu 'has_header' Zapytanie metoda: \t GET Zapytanie URL: \t http: // localhost: 8000/rury/data_browse/ Django wersja: \t 1.5.2 Typ wyjątku: \t AttributeError Wartość wyjątku: \t Obiekt "DirectTemplateView" nie ma atrybutu "has_header" Wyjątek Lokalizacja: \t /Library/Python/2.7/site-packages/django/utils/cache.py w patch_vary_headers, linia 142 Python wykonywalny: \t/usr/bin/python Python Wersja: \t 2.7.2' – mobopro

4

wpadłem na problem z odpowiedzią Pykler za pomocą podklasę DirectTemplateView. Konkretnie, ten błąd:

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 

Co pracował dla mnie było, aby zamiast konwertować dowolny wiersz tak:

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

do tego:

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

. Wynika z tego, że odpowiedź Pyklera zwraca obiekt widoku do oprogramowania pośredniego, powodując problemy z niektórymi niestandardowymi programami pośredniczącymi, render_to_responce lub renderowanie działa podobnie do zwracania obiektu odpowiedzi przez direct_to_template. Na razie wydaje się, że jest to podejście bardziej zgodne z poprzednimi wersjami. Ułatwia to również aktualizację Djano do wersji 1.5 lub 1.6 bez konieczności konwersji wszystkich widoków na widoki oparte na klasach. – arctelix