本文将集中讲解创建视图(views)。
我们的投票应用包含4个视图:
- 问题列表页 —— 显示最近的问题;
- 问题详情页 —— 显示问题文本,带有投票表单;
- 问题结果页 —— 显示某个问题的结果;
- 投票动作 —— 处理用户选择某个问题的某个选项。
增加视图
编辑polls/views.py文件如下:
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
编辑polls/urls.py文件如下:
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
app_name = 'polls'这一行是指定URL name的名字空间,防止URL name和其它app中的冲突。
在浏览器中访问“/polls/34/”、“/polls/34/results/”、“/polls/34/vote/”时,将分别显示刚刚增加的detail、results、vote视图。
完善视图
在polls目录下创建templates目录,再在templates中创建一个polls目录,最后在polls中创建一个index.html文件,即模板应该在polls/templates/polls/index.html,这样Django才能简单的使用polls/index.html来引用该模板。
编辑index.html如下:
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
编辑polls/views.py如下:
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
使用浏览器访问“/polls/”,可以看到一个问题列表页面,显示最近的5个问题。
生成404错误
编辑polls/views.py如下:
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
如果查询某个ID的question不存在,该视图将产生Http404异常。
get_list_or_404()函数和get_object_or_404()函数类似,不过返回结果是一个列表,如果列表为空则产生Http404异常。
编辑polls/templates/polls/detail.html如下:
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
使用浏览器访问“/polls/1/”,将看到问题“What's up?”以及几个选项。访问“/polls/34”将看到404异常。