python class tynu()_Pisanie pierwszej aplikacji Django, część 4.

Użycie widoków generycznych: Im mniej kodu tym lepiej¶

Widoki detail() (z Tutoriala 3) i results() są bardzo proste – i, jak wspomnieliśmy wcześniej, redundantne. Widok index(), który wyświetal listę ankiet, jest podobny.

Te widoki reprezentują częsty przypadek w podstawowym web dewelopmencie: pobieranie danych z bazy danych na podstawie parametru podanego w URL, ładownie szablonu i zwracanie wyrenderowanego szablonu. Z powodu, że jest to tak powszechne, Django dostarcza skrót, nazwany systemem „generycznych widoków”.

Widoki generyczne wyodrębniają powszechne wzorce do punktu, gdzie nie potrzebujesz nawet pisać pythonowego kodu, aby napisać aplikację.

Przekonwertujmy naszą aplikację ankietową, aby używała systemu widoków generycznych, abyśmy mogli usunąć sporo naszego własnego kodu. Musimy podjąć kilka kroków, aby dokonać konwersji. Będziemy:

Konwertować URLconf.

Usuwać stare, niepotrzebne widoki.

Wprowadzać nowe widoki oparte na generycznych widokach Django.

Kontynuuj czytanie, aby dowiedzieć się szczegółów.

Dlaczego podmiana kodu?

W ogólności, pisząc aplikację Django, ocenisz, czy widoki generyczne są dobre do twojego problemu i będziesz używał ich od początku zamiast robić refactoring kodu w połowie pracy. Ten tutorial specjalnie był skupiony na pisaniu widoków „w trudny sposób” aż do teraz, aby skupić się podstawowych konceptach.

Powinieneś znać podstawową matematykę zanim zaczniesz używać kalkulatora.

Modyfikacja URLconf¶

Najpierw otwórz URLconfa w polls/urls.py i zmień go tak:

polls/urls.py

from django.conf.urls import url

from . import views

app_name = 'polls'

urlpatterns = [

url(r'^$', views.IndexView.as_view(), name='index'),

url(r'^(?P[0-9]+)/$', views.DetailView.as_view(), name='detail'),

url(r'^(?P[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),

url(r'^(?P[0-9]+)/vote/$', views.vote, name='vote'),

]

Zwróć uwagę, że nazwa dopasowanego wzorca w wyrażeniach regularnych drugiego i trzeciego wzorca zmieniła się z na .

Modyfikacja widoków¶

Następnie usuniemy nasze stare widoki index, detail i results i użyjemy zamiast nich generycznych widoków Django. Aby to zrobić, otwórz plik polls/views.py i zmień go w ten sposób:

polls/views.py

from django.shortcuts import get_object_or_404, render

from django.http import HttpResponseRedirect

from django.urls import reverse

from django.views import generic

from .models import Choice, Question

class IndexView(generic.ListView):

template_name = 'polls/index.html'

context_object_name = 'latest_question_list'

def get_queryset(self):

"""Return the last five published questions."""

return Question.objects.order_by('-pub_date')[:5]

class DetailView(generic.DetailView):

model = Question

template_name = 'polls/detail.html'

class ResultsView(generic.DetailView):

model = Question

template_name = 'polls/results.html'

def vote(request, question_id):

... # same as above, no changes needed.

Używamy tutaj dwóch widoków generycznych: ListView i DetailView. Odpowiednio, te dwa widoki abstrahują koncepty „wyświetlania listy obiektów” i „wyświetlania strony szczegółów dla wybranego typu obiektu”.

Każdy widok generyczny potrzebuje wiedzieć, na podstawie jakiego modelu będzie działał. Ta informacja jest dostarczona przez atrybut model.

Widok generyczny DetailView spodziewa się wartości klucza głównego zebranego z URL-a i nazwanego "pk", więc zmieniliśmy question_id na pk dla widoków generycznych.

Domyślnie widok generyczny DetailView używa szablonu o nazwie /_detail.html. W naszym przypadku użyłby szablonu "polls/question_detail.html". Atrybut template_name jest używany, by kazać Django użyć wskazanego szablonu zamiast samo-wygenerowanej domyślnej nazwy szablonu. Wskazujemy również template_name dla widoku listy results – to powoduje, że widok wyników i widok szczegółów mają inny wygląd po wyrenderowaniu, mimo że oba są DetailView pod maską.

Podobnie widok generyczny ListView używa domyślnego szablonu o nazwie /_list.html; używamy template_name, aby powiedzieć ListView, by używała naszego istniejącego szablonu "polls/index.html".

W poprzednich częściach tutoriala szablonom dawaliśmy kontekst, który zawierał zmienne kontekstu question i latest_question_list. Dla DetailView zmienna question jest dostarczona automatycznie – ponieważ używamy modelu Django (Question), Django może wyznaczyć odpowiednią nazwę dla zmiennej kontekstowej. Jednak dla ListView automatycznie generowaną zmienną kontekstową jest question_list. Aby to nadpisać nadajemy wartość atrybutowi context_object_name, wskazując, że chcemy użyć zamiast niej latest_question_list. Alternatywnym podejściem byłoby zmienienie szablonów, aby zgadzały się z nowymi domyślnymi zmiennymi kontekstowymi – ale dużo prościej jest powiedzieć Django, aby używało zmiennej, jakiej chcesz.

Uruchom serwer i użyj nowej aplikacji ankietowej opartej na widokach generycznych.

Po wszystkie szczegóły widoków generycznych, sprawdź dokumentację widoków generycznych.

Kiedy już czujesz się dobrze z formularzami i widokami generycznymi, przeczytaj część 5 tego tutoriala, aby nauczyć się testowania naszej ankietowej aplikacji.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值