编写你的第一个Django应用程序,第四部分
Posted xjmlove
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写你的第一个Django应用程序,第四部分相关的知识,希望对你有一定的参考价值。
本教程从随笔三停止的地方开始。这里将重点放简单的表单处理和削减我们的代码。
写一个简单的表单
更新模版文件polls/detail.html,以便包含一个html<form>元素:
<body> <h1>{{ question.question_text }}</h1> {% if error_message %}<p><strong>{{ error_message }}</strong>></p>>{% endif %} <form action="{% url ‘polls:vote‘ question.id %}" method="post"> {% csrf_token %} {% for choice in question.choice_set.all %} <input type="radio" name="choice" id="choice{{ forloop.counter}}" value="{{ choice.id}}"> <label for ="choice{{ forloop.counter}}">{{ choice.choice_text }}</label><br /> {% endfor %} <input type="submit" value="Vote"> </form> </body>
说明:
- 上面的模版为每个问题选项显示一个单选按钮。value按钮相关联的是问题的选择的ID。name为每个单选按钮的choice。这意味着,当有人选择其中一个单选按钮并提交表单时,它将发送post数据choice=#,#表示所选选项的id。
- forloop.counter表示for标签经过其循环的次数
- 由于我们正在创建POST表单(可能会影响其循环的次数)。简而言之,所有以内部URL为目标的POST表单都应使用模版标记:{% csrf_token %}
表单写完,就创建一个处理提交数据的django视图。并对其进行处理。
打开polls/views.py文件编写代码:
from django.urls import reverse def vote(request,question_id): question=get_object_or_404(Question,pk=question_id) try: selected_choice=question.choice_set.get(pk=request.POST[‘choice‘]) except(KeyError,Choice.DoesNotExist): return render(request,‘polls/detail‘,{ ‘question‘:question, ‘error_message‘:"You didn‘t select a choice.", }) else: selected_choice.votes+=1 selected_choice.save() return HttpResponse(reverse(‘polls:results‘,args=(question_id)))
这段代码包含本教程尚未涉及的一些内容:
- request.POST是一个类似字典的对象,可以通过key访问提交的数据。request.POST[‘choice‘]以字符串形式返回所选项的ID。
- 如果request.POST[‘choice‘] KeyError,在POST数据中没有提供。将会引发error。上面的代码会检查并重新显示问题并显示错误消息。You didn‘t select a choice.
- 增加了一个票数选择计数,代码将返回一个HttpResponseRedirect。而不是一个正常的response。HttpResponseRedirect只有一个参数:用户将被重定向到URL。
- reverse()调用将返回一个类似的字符串:‘/polls/3/results/‘。这个将重定向的URL会调用‘results’视图显示最终结果。
当人在问题中投票后,该vote()视图将到results页面。我们来写下这个观点:
polls/views.py:
def results(request,question_id): question=get_object_or_404(Question,pk=question_id) return render(request,‘polls/results.html‘,{‘question‘:question})
可以看出,这和detail视图几乎一样。等下解决此冗余。
再去模版目录下创建:polls/results.html
<body> <h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li> {{ choice.choice_text }} -- {{ choice.votes }} 票 </li> {% endfor %} </ul> <a href="{% url ‘polls:detail‘ question.id %}">继续投票?</a> </body> </html>
现在,可以进行投票了。输入127.0.0.1/polls 然后一直点击下去。
使用通用视图
之前有提到两个视图代码几乎一样。冗余的,django提供了一个称为‘通用视图‘系统的快捷方式。
将会:
- 转换URLconf
- 删除一些旧的不需要的视图
- 基于django的通用视图引入新的视图
修改URL配置
首先打开polls/urls.py更改代码:
以上是关于编写你的第一个Django应用程序,第四部分的主要内容,如果未能解决你的问题,请参考以下文章
Django L1 编写你的第一个Django应用,第1部分