编写你的第一个 Django 应用程序,第4部分
本教程从教程 3 停止的地方开始。我们是 继续民意调查应用程序,并将专注于表单处理和 减少我们的代码。
一、编写最小表单
让我们更新上一个教程的投票详细信息模板(“polls/detail.html”) ,以便模板包含一个 HTML <form>元素:
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
<fieldset>
<legend><h1>{{ question.question_text }}</h1></legend>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
{% 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 %}
</fieldset>
<input type="submit" value="Vote">
</form>
- 由于我们正在创建一个 POST 表单(这可能会产生修改的效果 数据),我们需要担心跨站点请求伪造。 值得庆幸的是,你不必太担心,因为 Django 带有一个 有用的系统来防止它。简而言之,所有 POST 表单 定位到内部网址应使用
{% csrf_token %}模板标记。
现在,让我们创建一个 Django 视图来处理提交的数据并 随之而来的东西。请记住,在教程 3 中,我们 为包含以下行的投票应用程序创建了一个 URLconf:
path("<int:question_id>/vote/", views.vote, name="vote"),
我们之前创建了vote()函数的虚拟实现。让我们 创建一个真实版本。将以下内容添加到:polls/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse from .models import Choice, Question # ...
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):
# Redisplay the question voting form.
return render(
request,
"polls/detail.html",
{
"question": question,
"error_message": "You didn't select a choice.",
},
)
else:
selected_choice.votes += 1
selected_choice.save()
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))
此代码包含一些我们在本教程中尚未介绍的内容:
请求。POST是一个类似字典的 允许您按键名访问提交数据的对象。在本例中,返回所选选项的 ID,作为 字符串。请求。开机自检值为 始终为字符串。request.POST['choice']请注意,Django 也提供了
请求。GET 以相同的方式访问 GET 数据 – 但我们明确使用请求。在我们的代码中 POST,以确保数据仅 通过开机自检呼叫进行更改。request.POST['choice']如果开机自检数据中未提供,将引发密钥错误。上面的代码检查KeyError并重新显示错误的问题表单 消息(如果未给出)。choicechoice递增选择计数后,代码将返回
HttpResponseRedirect,而不是正常的HttpResponse。HttpResponseRedirect采用单个参数: 用户将被重定向到的 URL(请参阅以下点,了解如何 在这种情况下,我们构造 URL)。正如上面的 Python 注释所指出的,在成功处理 开机自检数据。这个技巧不是特定于 Django 的;这是很好的网络开发 一般做法。
在这个例子中,我们在
HttpResponseRedirect构造函数中使用了reverse()函数。 此函数有助于避免在视图函数中对 URL 进行硬编码。 它被赋予了我们要向其传递控制权的视图的名称和 指向该视图的 URL 模式的变量部分。在此 案例,使用我们在教程 3 中设置的 URLconf, 这个reverse()调用将返回一个字符串,例如"/polls/3/results/"
对问题进行投票后,vote() 视图将重定向到结果 问题的页面。让我们改写下这个视图:
from django.shortcuts import get_object_or_404, render def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, "polls/results.html", {"question": question})
这与教程 3 中的 detail() 视图几乎完全相同。唯一的区别是模板名称。我们将解决此问题 以后冗余。
现在,创建一个模板:polls/results.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
现在,转到/polls/1/ 浏览器中并在问题中投票。您应该会看到一个 每次投票时都会更新的结果页面。如果您提交表格 如果没有选择选项,您应该会看到错误消息。
二、使用通用视图:代码越少越好
detail()(来自教程 3)和 results() 视图非常短 - 如上所述,冗余。显示投票列表的 index() 视图与此类似。
这些视图代表了基本 Web 开发的常见情况:从以下位置获取数据 数据库根据 URL 中传递的参数,加载模板和 返回呈现的模板。
因为这太常见了,Django 提供了一个 快捷方式,称为“通用视图”系统。
通用视图将常见模式抽象到您甚至不需要的程度 编写 Python 代码来编写应用程序。
让我们将我们的投票应用程序转换为使用通用视图系统,以便我们可以删除 一堆我们自己的代码。我们必须采取几个步骤才能进行转换。 我们会的:
- 转换网址。
- 删除一些旧的、不需要的视图。
- 基于 Django 的通用视图引入新视图。
请继续阅读以了解详细信息。
三、修改网址
首先,打开polls/urls.py文件 , URLconf 并像这样更改它:
from django.urls import path from . import views app_name = "polls"
urlpatterns = [
path("", views.IndexView.as_view(), name="index"),
path("<int:pk>/", views.DetailView.as_view(), name="detail"),
path("<int:pk>/results/", views.ResultsView.as_view(), name="results"),
path("<int:question_id>/vote/", views.vote, name="vote"),
]
请注意,第二个和 第三种模式已从 <question_id>更改为 <pk>。
四、修改视图
接下来,我们将删除旧的 index、detail 和 results 视图,并使用 Django 的通用视图。为此,请打开 polls/views.py 文件并按如下所示进行更改:
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
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.
我们在这里使用两个通用视图: ListView and DetailView. 视图。分别是那些 两个视图抽象化了“显示对象列表”和 “显示特定类型对象的详细信息页面。”
- 每个通用视图都需要知道它将执行什么模型 后。这是使用model属性提供的。
通用视图 期望调用从 URL 称为pk值,因此我们把question_id更改为pk 的通用视图。DetailView
在本教程的前面部分中,提供了模板 具有包含 和 上下文变量的上下文。
对于变量提供 自动 – 因为我们使用的是 Django 模型 (), Django 能够为上下文变量确定适当的名称。
但是,对于 ListView,自动生成的上下文变量为 。为了覆盖它,我们提供了属性,指定我们要改用。
作为替代方法,您可以更改模板以匹配 新的默认上下文变量 - 但告诉 Django 要容易得多 使用所需的变量。
运行服务器,并使用基于通用视图的新网络投票应用。
有关通用视图的完整详细信息,请参阅通用视图文档。
当您熟悉表单和通用视图后,请阅读本文的第 5 部分 教程,了解如何测试我们的民意调查应用程序。
---------------------------------------end--------------------------
编写你的第一个 Django 应用程序,第4部分的更多相关文章
- 编写你的第一个django应用程序2
从1停止的地方开始,我们将设置数据库,创建您的第一个模型,并快速介绍django自动生成的管理站点 数据库设置 现在,打开mysite/settings.py.这是一个普通的python模块,其中模块 ...
- 编写你的第一个django应用程序4
本教程上接教程3,我们将继续开发网页投票应用,本部分将主要关注简单的表单处理以及如何对代码进行优化 写一个简单的表单 让我们更新一下在上一个教程中编写的投票详细页面的模板(‘polls/detail. ...
- 编写你的第一个django应用程序3
这一篇从教程第2部分结尾的地方继续讲起.我们将继续编写投票应用,并且专注于如何创建公用界面--也被称为视图 概况 django视图概念是一类具有相同功能和末班的网页的集合,比如,在一个博客应用中,你可 ...
- Django教程:第一个Django应用程序(3)
Django教程:第一个Django应用程序(3) 2013-10-08 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)
编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)
编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...
- 第一个Django应用程序_part3
一.概述 此文延续第一个Django应用程序part2. 官方文档:https://docs.djangoproject.com/en/1.11/intro/tutorial03/ view是Djan ...
- 编写你的第一个Django应用
安装 Python 作为一个 Python Web 框架,Django 需要 Python.更多细节请参见 我应该使用哪个版本的 Python 来配合 Django?. Python 包含了一个名为 ...
- 搭建你的第一个Django应用程序
首先你要确保你机器上面安装了python:Python开发_python的安装 python的相关学习资料:http://www.cnblogs.com/hongten/tag/python/ 其次, ...
- Django教程:第一个Django应用程序(4)
Django教程:第一个Django应用程序(4) 2013-10-09 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...
随机推荐
- 如何通过C#修改Windows操作系统时间
C#的System.DateTime类提供了对日期时间的封装,用它进行时间的转换和处理很方便,但是我没有在其中找到任何可以用来修改系统时间的成员.用过VC.VB等的朋友可能知道,我们可以调用Win32 ...
- 总是被低估,从未被超越,揭秘QQ极致丝滑背后的硬核IM技术优化
本文由腾讯云开发者张曌.毕磊分享,原题"QQ 9"傻快傻快"的?!带你看看背后的技术秘密",本文进行了排版和内容优化等. 1.引言 最新发布的 QQ 9 自上线 ...
- 为什么在 Windows 下用 Ctrl+Z 退出 Python 而 Linux 下用 Ctrl+D 呢?
打开我们的命令行,输入 python ,我们会进入 python 的交互模式. 当我们想退出 python ,返回我们的 shell 时,你将如何退出? 如上,两个行之有效的方法是输入 exit() ...
- Shapefile代码示例
Shapefile代码示例 1. 读取Shapefile文件 1.1 实现思路 graph TD A[查找必要文件] --> B[获取文件编码] B --> C[打开图层] C --> ...
- 记录小程序跳转h5,然后h5涉及下载文件的问题
小程序跳转h5中,可以在小程序增加一个页面使用webView方式嵌套三方小程序,不过需要配置白名单 由于小程序的限制,不能在嵌套的h5中进行文件下载 网上也没有很好的解决方法,解决方法是再跳到小程序带 ...
- vue3.0实现炫酷的随机验证码功能
先上图 接下来楼一眼实现代码 这里说明一下,我用到了vue3.0,vant3.0以及阿里图标,vant 很人性化针对vue3.0新出了个vant3.0版本,阿里则是适配vue3.0的.我们将verif ...
- PMP视频总结
https://edu.51cto.com/center/wejob/user/course?train_id=955 重要链接:①[PC端学习平台]:https://edu.51cto.com/ce ...
- w3cschool-Nginx 使用手册
https://www.w3cschool.cn/nginxsysc/ Nginx 使用手册 手册简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 ...
- Drawable图形定制
设置背景设置背景 button或者textview我们想要自定义他的背景就需要用到Drawable中创建xml文件 例如 shape标签是用来控制背景的形状的 他下面的子标签有 stroke控制描边 ...
- dart变量声明和变量类型
ps==>所有的代码必须放在main方法中 main方法有两种写法 1==> main() { print("你好,dart我们相遇了"); } 2==> voi ...