Django 2.1入门教程(三)

本文将集中讲解创建视图(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/”时,将分别显示刚刚增加的detailresultsvote视图。


完善视图

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异常。

参考:https://docs.djangoproject.com/en/2.1/intro/tutorial03/

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值