Part 3 – Create views, templates. Convert view to class-based View
- Note from django 3.0 learning material https://docs.djangoproject.com/en/3.0
Lifecycle
Add views
views.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token keyword">from</span> django<span class="token punctuation">.</span>http <span class="token keyword">import</span> HttpResponse <span class="token keyword">from</span> django<span class="token punctuation">.</span>template <span class="token keyword">import</span> loader <span class="token keyword">from</span> django<span class="token punctuation">.</span>shortcuts <span class="token keyword">import</span> get_object_or_404<span class="token punctuation">,</span> render <span class="token keyword">from</span> <span class="token punctuation">.</span>models <span class="token keyword">import</span> Question <span class="token keyword">def</span> <span class="token function">index</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> latest_question_list <span class="token operator">=</span> Question<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>order_by<span class="token punctuation">(</span><span class="token string">'-pub_date'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">5</span><span class="token punctuation">]</span> template <span class="token operator">=</span> loader<span class="token punctuation">.</span>get_template<span class="token punctuation">(</span><span class="token string">'polls/index.html'</span><span class="token punctuation">)</span> context <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'latest_question_list'</span><span class="token punctuation">:</span> latest_question_list<span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> HttpResponse<span class="token punctuation">(</span>template<span class="token punctuation">.</span>render<span class="token punctuation">(</span>context<span class="token punctuation">,</span> request<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">detail</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> question <span class="token operator">=</span> get_object_or_404<span class="token punctuation">(</span>Question<span class="token punctuation">,</span> pk<span class="token operator">=</span>question_id<span class="token punctuation">)</span> <span class="token keyword">return</span> render<span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'polls/detail.html'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string">'question'</span><span class="token punctuation">:</span> question<span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">results</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> response <span class="token operator">=</span> <span class="token string">"You're looking at the results of question %s."</span> <span class="token keyword">return</span> HttpResponse<span class="token punctuation">(</span>response <span class="token operator">%</span> question_id<span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">vote</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">return</span> HttpResponse<span class="token punctuation">(</span><span class="token string">"You're voting on question %s."</span> <span class="token operator">%</span> question_id<span class="token punctuation">)</span> |
Add routes
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">from</span> django<span class="token punctuation">.</span>urls <span class="token keyword">import</span> path <span class="token keyword">from</span> <span class="token punctuation">.</span> <span class="token keyword">import</span> views urlpatterns <span class="token operator">=</span> <span class="token punctuation">[</span> path<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>index<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'index'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:question_id>/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>detail<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'detail'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:question_id>/results/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>results<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'results'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:question_id>/vote/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>vote<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'vote'</span><span class="token punctuation">)</span> <span class="token punctuation">]</span> |
Add template
Default template set in polls/templates/polls
polls/templates/polls/index.html
:
1 2 3 4 5 6 7 8 9 10 | <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">if</span> latest_question_list <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token operator"><</span>ul<span class="token operator">></span> <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">for</span> question <span class="token keyword">in</span> latest_question_list <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token operator"><</span>li<span class="token operator">></span><span class="token operator"><</span>a href<span class="token operator">=</span><span class="token string">"/polls/{{ question.id }}/"</span><span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span> question<span class="token punctuation">.</span>question_text <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>a<span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> <span class="token punctuation">{</span><span class="token operator">%</span> endfor <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>ul<span class="token operator">></span> <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">else</span> <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token operator"><</span>p<span class="token operator">></span>No polls are available<span class="token punctuation">.</span><span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span> <span class="token punctuation">{</span><span class="token operator">%</span> endif <span class="token operator">%</span><span class="token punctuation">}</span> |
polls/templates/polls/detail.html
:
1 2 3 4 5 6 7 | <span class="token operator"><</span>h1<span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span> question<span class="token punctuation">.</span>question_text <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>h1<span class="token operator">></span> <span class="token operator"><</span>ul<span class="token operator">></span> <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">for</span> choice <span class="token keyword">in</span> question<span class="token punctuation">.</span>choice_set<span class="token punctuation">.</span><span class="token builtin">all</span> <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token operator"><</span>li<span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span> choice<span class="token punctuation">.</span>choice_text <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> <span class="token punctuation">{</span><span class="token operator">%</span> endfor <span class="token operator">%</span><span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>ul<span class="token operator">></span> |
Want to change the template path => mysite/settings.py
Undefined ????
=> 3 url transfer type:
- Cattle type:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/polls/{{ question.id }}/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ question.question_text }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> |
- Type of name transfer of url: in the file
polls/urls.py
namedname='detail'
=> name isdetail
:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{% url <span class="token punctuation">'</span>detail<span class="token punctuation">'</span> question.id %}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ question.question_text }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> |
- Type of transmission namespace
polls
and url namedetail
:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{% url <span class="token punctuation">'</span>polls:detail<span class="token punctuation">'</span> question.id %}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ question.question_text }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> |
urls.py
: more app_name = 'polls'
get_object_or_404
and render
are shortcuts. Other spellings:
views.py
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">def</span> <span class="token function">index</span><span class="token punctuation">(</span>request<span class="token punctuation">)</span><span class="token punctuation">:</span> latest_question_list <span class="token operator">=</span> Question<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>order_by<span class="token punctuation">(</span><span class="token string">'-pub_date'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">5</span><span class="token punctuation">]</span> template <span class="token operator">=</span> loader<span class="token punctuation">.</span>get_template<span class="token punctuation">(</span><span class="token string">'polls/index.html'</span><span class="token punctuation">)</span> context <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">'latest_question_list'</span><span class="token punctuation">:</span> latest_question_list<span class="token punctuation">}</span> <span class="token keyword">return</span> HttpResponse<span class="token punctuation">(</span>template<span class="token punctuation">.</span>render<span class="token punctuation">(</span>context<span class="token punctuation">,</span> request<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">def</span> <span class="token function">detail</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">try</span><span class="token punctuation">:</span> question <span class="token operator">=</span> Question<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>get<span class="token punctuation">(</span>pk<span class="token operator">=</span>question_id<span class="token punctuation">)</span> <span class="token keyword">except</span> Question<span class="token punctuation">.</span>DoesNotExist<span class="token punctuation">:</span> <span class="token keyword">raise</span> Http404<span class="token punctuation">(</span><span class="token string">"Question does not exist"</span><span class="token punctuation">)</span> <span class="token keyword">return</span> render<span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'polls/detail.html'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string">'question'</span><span class="token punctuation">:</span> question<span class="token punctuation">}</span><span class="token punctuation">)</span> |
Series django first project
Add a Vote function form
polls/templates/polls/detail.html
:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>{{ question.question_text }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span> {% if error_message %}<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>strong</span><span class="token punctuation">></span></span>{{ error_message }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>strong</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span>{% endif %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{% url <span class="token punctuation">'</span>polls:vote<span class="token punctuation">'</span> question.id %}<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% csrf_token %} {% for choice in question.choice_set.all %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>radio<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>choice<span class="token punctuation">"</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>choice{{ forloop.counter }}<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{{ choice.id }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>label</span> <span class="token attr-name">for</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>choice{{ forloop.counter }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ choice.choice_text }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>label</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>br</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Vote<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span> |
polls/views.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">def</span> <span class="token function">vote</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> question <span class="token operator">=</span> get_object_or_404<span class="token punctuation">(</span>Question<span class="token punctuation">,</span> pk<span class="token operator">=</span>question_id<span class="token punctuation">)</span> <span class="token keyword">try</span><span class="token punctuation">:</span> selected_choice <span class="token operator">=</span> question<span class="token punctuation">.</span>choice_set<span class="token punctuation">.</span>get<span class="token punctuation">(</span>pk<span class="token operator">=</span>request<span class="token punctuation">.</span>POST<span class="token punctuation">[</span><span class="token string">'choice'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">except</span> <span class="token punctuation">(</span>KeyError<span class="token punctuation">,</span> Choice<span class="token punctuation">.</span>DoesNotExist<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># Redisplay the question voting form.</span> <span class="token keyword">return</span> render<span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'polls/detail.html'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token string">'question'</span><span class="token punctuation">:</span> question<span class="token punctuation">,</span> <span class="token string">'error_message'</span><span class="token punctuation">:</span> <span class="token string">"You didn't select a choice."</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">else</span><span class="token punctuation">:</span> selected_choice<span class="token punctuation">.</span>votes <span class="token operator">+=</span> <span class="token number">1</span> selected_choice<span class="token punctuation">.</span>save<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># Always return an HttpResponseRedirect after successfully dealing</span> <span class="token comment"># with POST data. This prevents data from being posted twice if a</span> <span class="token comment"># user hits the Back button.</span> <span class="token keyword">return</span> HttpResponseRedirect<span class="token punctuation">(</span>reverse<span class="token punctuation">(</span><span class="token string">'polls:results'</span><span class="token punctuation">,</span> args<span class="token operator">=</span><span class="token punctuation">(</span>question<span class="token punctuation">.</span><span class="token builtin">id</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span> |
View result function
polls/views.py
:
1 2 3 4 | <span class="token keyword">def</span> <span class="token function">results</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> question <span class="token operator">=</span> get_object_or_404<span class="token punctuation">(</span>Question<span class="token punctuation">,</span> pk<span class="token operator">=</span>question_id<span class="token punctuation">)</span> <span class="token keyword">return</span> render<span class="token punctuation">(</span>request<span class="token punctuation">,</span> <span class="token string">'polls/results.html'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string">'question'</span><span class="token punctuation">:</span> question<span class="token punctuation">}</span><span class="token punctuation">)</span> |
polls/templates/polls/results.html
:
1 2 3 4 5 6 7 8 9 10 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>{{ question.question_text }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span> {% for choice in question.choice_set.all %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{% url <span class="token punctuation">'</span>polls:detail<span class="token punctuation">'</span> question.id %}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Vote again?<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span> |
If there are 2 people submitting the exact same file at the same time => the voting result will only increase by 1 unit (expected to be 2) => Research https://docs.djangoproject.com/en/3.0/ref/models/expressions/#avoiding-race-conditions-using-f
class-based view
The views flow above work according to a very basic spec, which is generally taking requests with parameters, then querying and retrieving the template to return a response. Django converts this flow (Function Based Views) into another format (Class Base View):
- convert URLconf.
- Delete unnecessary views.
- Create views based on Django’s generic views.
Correction URLconf polls/urls.py
:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">from</span> django<span class="token punctuation">.</span>urls <span class="token keyword">import</span> path <span class="token keyword">from</span> <span class="token punctuation">.</span> <span class="token keyword">import</span> views app_name <span class="token operator">=</span> <span class="token string">'polls'</span> urlpatterns <span class="token operator">=</span> <span class="token punctuation">[</span> path<span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>IndexView<span class="token punctuation">.</span>as_view<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'index'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:pk>/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>DetailView<span class="token punctuation">.</span>as_view<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'detail'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:pk>/results/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>ResultsView<span class="token punctuation">.</span>as_view<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'results'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> path<span class="token punctuation">(</span><span class="token string">'<int:question_id>/vote/'</span><span class="token punctuation">,</span> views<span class="token punctuation">.</span>vote<span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token string">'vote'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span> |
Correction views: polls/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <span class="token keyword">from</span> django<span class="token punctuation">.</span>http <span class="token keyword">import</span> HttpResponseRedirect <span class="token keyword">from</span> django<span class="token punctuation">.</span>shortcuts <span class="token keyword">import</span> get_object_or_404<span class="token punctuation">,</span> render <span class="token keyword">from</span> django<span class="token punctuation">.</span>urls <span class="token keyword">import</span> reverse <span class="token keyword">from</span> django<span class="token punctuation">.</span>views <span class="token keyword">import</span> generic <span class="token keyword">from</span> <span class="token punctuation">.</span>models <span class="token keyword">import</span> Choice<span class="token punctuation">,</span> Question <span class="token keyword">class</span> <span class="token class-name">IndexView</span><span class="token punctuation">(</span>generic<span class="token punctuation">.</span>ListView<span class="token punctuation">)</span><span class="token punctuation">:</span> template_name <span class="token operator">=</span> <span class="token string">'polls/index.html'</span> context_object_name <span class="token operator">=</span> <span class="token string">'latest_question_list'</span> <span class="token keyword">def</span> <span class="token function">get_queryset</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token triple-quoted-string string">"""Return the last five published questions."""</span> <span class="token keyword">return</span> Question<span class="token punctuation">.</span>objects<span class="token punctuation">.</span>order_by<span class="token punctuation">(</span><span class="token string">'-pub_date'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token keyword">class</span> <span class="token class-name">DetailView</span><span class="token punctuation">(</span>generic<span class="token punctuation">.</span>DetailView<span class="token punctuation">)</span><span class="token punctuation">:</span> model <span class="token operator">=</span> Question template_name <span class="token operator">=</span> <span class="token string">'polls/detail.html'</span> <span class="token keyword">class</span> <span class="token class-name">ResultsView</span><span class="token punctuation">(</span>generic<span class="token punctuation">.</span>DetailView<span class="token punctuation">)</span><span class="token punctuation">:</span> model <span class="token operator">=</span> Question template_name <span class="token operator">=</span> <span class="token string">'polls/results.html'</span> <span class="token keyword">def</span> <span class="token function">vote</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> question_id<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token comment"># same as above, no changes needed.</span> |
generic.ListView
,generic.DetailView
These are classes that abstract the process of handling specific objects, perform most of the basic processing called collectively Class Base Viewtemplate_name = polls/details.html
: Specifies the template name instead of the default ("polls/question_detail.html"
)context_object_name = 'latest_question_list'
Specifies the return variable name for the template, otherwise in this context the default variable name will bequestion_list
get_queryset
: There are a bunch of query helper methods calledqueryset
, In this case, override the method to get 5 questions by pub_date.