Django学习笔记:入门开发(二)

54 sec read

重新规划网页视图

投票系统应用中,需要如下视图:首页(列表页)、详细页、投票功能、投票结果页。

添加视图

视图与URL绑定

完善视图(在视图中引入模型)

创建模版

项目的TEMPLATES设置描述了Django将如何加载并渲染模板。默认的设置文件settings.py配置了一个DjangoTemplates后端,其中将APP_DIRS选项设置为True。按照惯例,DjangoTemplates在INSTALLED_APPS所包含的每个应用的目录下查找名为”templates”子目录。因此即使我们不像教程中管理后台那样去修改DIRS,Django也可以找到应用的模版。

我们可以将所有的模板聚在一起,放在一个大的模板目录下,且可以运行地很好。然而,我们的这个模板属于投票应用,不像我们在先前教程中创建的管理站点模板,我们将把它们放在应用的模板目录下(polls/templates)而不是项目模板目录下(templates)。

在刚创建的templates目录中,创建另外一个目录polls,并在其中创建一个文件index.html。换句话讲,你的模板应该位于 polls/templates/polls/index.html。由于app_directories 模板加载器按照上面描述的方式工作,在Django中你可以简单地用polls/index.html引用这个模板。

绑定模版和视图

使用render()精简绑定

设置404错误页面

get_object_or_404()精简404页面:

创建polls/detail.html

移除模版中写死的URL

打开polls/index.html,可以看到链接是写死的,为防止后期更改url路由,需要进行修改:

通过{% url %}模版标签进行设置:

url.py中的name值即为{% url %}的模版tag,即URL的名称:

为URL名称添加命名空间

在正常情况下Django一个项目有多个应用,定于url名称的时候可能会出现重复的现象,解决方案是给url名称加上命名空间。方法比较简单,在polls/urls.py文件中设置app_name:

然后再对模板进行修改,{% url %}修改为:

创建投票详情页面

投票详情页面主要的功能是进行投票,核心是提交表单。首先先来修改polls/detail.html模板:

{%csrf_token %}主要是防止csrf的黑客攻击,每个表单一般都会使用,在这里先不做详细介绍。

创建投票功能

在polls/urls.py新建url规则:

在视图中创建vote()方法:

创建投票结果页

先创建好视图:

再创建好模板polls/results.html

在配置url规则:

重构,让代码更加精简

上面的步骤已经完成了基础的功能,为了使得代码更加方便进行后期维护,需要对代码进行重构,对部分代码进行抽象。

改进URLconf

将:

修改为:

变化的内容:

  • <question_id>变成了<pk>
  • detail变成了views.DetailView.as_view()

改进views

将原先的:

修改为:

主要变化的内容:将页面视图由方法变成了类,我们在这里使用两个通用视图 ListViewDetailView。这两个视图分别抽象“显示一个对象列表”和“显示一个特定类型对象的详细信息页面”这两种概念。

  • 每个通用视图需要知道它将作用于哪个模型,由model 属性提供。
  • DetailView期望从URL中捕获名为”pk”的主键值,因此我们把polls/urls.py中question_id改成了pk以使通用视图可以找到主键值。

默认情况下,通用视图DetailView 使用一个叫做<app name>/<model name>_detail.html的模板。在例子中,它将使用 “polls/question_detail.html”模板。template_name属性是用来告诉Django使用一个指定的模板名字,而不是自动生成的默认名字。 我们也为results列表视图指定了template_name,这确保results视图和detail视图在渲染时具有不同的外观,即使它们在后台都是同一个 DetailView。类似地,ListView使用一个叫做<app name>/<model name>_list.html的默认模板;我们使用template_name 来告诉ListView 使用我们自己已经存在的”polls/index.html”模板。

在之前的教程中,提供模板文件时都带有一个包含question 和 latest_question_list 变量的context。对于DetailView ,question变量会自动提供,对于ListView, 自动生成的context 变量是question_list。为了覆盖这个行为,我们提供 context_object_name 属性,表示我们想使用latest_question_list。作为一种替换方案,你可以改变你的模板来匹配新的context变量。

未完待续…

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

用户模型之三户模型

10 sec read

常用算法之分治法

分治法概念 分治法(divide-and-conquer)字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治有两个特点: 子问题相互独立且与原问题形式 ...
1 min read

使用Python更换外网IP

在进行数据抓取时,经常会遇到IP被限制的情况,常见的解决方案是搭建代理IP池,或购买IP代理的服务。除此之外,还有一个另外的方法就是使用家里的宽带网络进行抓取。由于家里的宽带每次断开重新连接时都会分配一个新的IP,所以在我们抓取数据的时候,判断 ...
36 sec read

Leave a Reply

Your email address will not be published. Required fields are marked *