4:表单和通用视图

表单和通用视图

  • 1、编写一个简单的表单
    • (1)更新polls/detail.html文件 使其包含一个html < form > 元素
    • (2)创建一个Django视图来处理提交的数据
    • (3)当有人对 Question 进行投票后,vote()视图将请求重定向到 Question 的结果页面。
    • (4)创建polls/results.html 模板
  • 2、使用通用视图,代码还是少一些比较好
  • 3、改良视图

1、编写一个简单的表单

(1)更新polls/detail.html文件 使其包含一个html < form > 元素

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head><meta charset="UTF-8"><title>Polls Details</title>
</head>
<body><h1>{{question.question_text}}</h1><ul>{% for choice in question.choice_set.all %}<li>{{ choice.choice_text }}</li>{% endfor %}</ul><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>
</body>
</html>

代码解释

1、表单开始标签:
<form action="{% url 'polls:vote' question.id  %}" method="post">
<form>:定义表单。
action="{% url 'polls:vote' question.id %}":表单提交的URL,由Django的url模板标签生成,指向名为polls:vote的视图,传递当前问题的ID。
method="post":表单提交方法为POST。2、CSRF保护:由于我们创建了一个POST表单(它具有修改数据的作用),所以我们要小心跨站点请求伪造
{% csrf_token %}:Django模板标签,用于生成CSRF令牌,防止跨站请求伪造攻击。3、表单字段集
<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 }}">:定义一个单选按钮,name属性用于组名,id属性唯一标识每个单选按钮,value属性为选项ID。
<label for="choice{{ forloop.counter }}">{{choice.choice_text}}</label>:定义单选按钮的标签。
<br>:换行符。4、提交按钮
<input type="submit" value="Vote">:定义表单的提交按钮。

(2)创建一个Django视图来处理提交的数据

将以下代码 添加到 polls.views.py

导入模块
from django.db.models import F #导入F表达式,用于在数据库层面进行字段操作
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse #导入reverse函数,用于反向解析URL
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"])#异常处理:捕获KeyError和Choice.DoesNotExist异常,表示用户没有选择任何选项或选择的选项不存在except(KeyError,Choice.DoesNotExist):#重新渲染投票页面,并显示错误信息return render(request,"polls/detail.html" ,{"question":question,"error_message":"You didn't select a choice."})#更新投票数并保存else:selected_choice.votes=F("votes")+1selected_choice.save()#重定向到结果页面,生成结果页面的URLreturn HttpResponseRedirect(reverse("polls:results",args=(question.id,)))

(3)当有人对 Question 进行投票后,vote()视图将请求重定向到 Question 的结果页面。

def results(request,question_id):question=get_object_or_404(Question,pk=question_id)return render(request,"polls/results.html",{"question":question})

(4)创建polls/results.html 模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Polls Results</title>
</head>
<body><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>
</body>
</html>

访问polls/3/并进行投票
在这里插入图片描述
在这里插入图片描述

  • 注意
    如果报错,原因很可能是:args 期望的是一个可迭代对象,但你传递的是一个整数

需要确保 args 是一个包含单个元素的元组。在Python中,如果元组只有一个元素,需要在元素后面加一个逗号来明确它是一个元组

在这里插入图片描述

2、使用通用视图,代码还是少一些比较好

视图反映基本的网络开发中一个常见情况,根据URL中的参数,从数据库中获取数据,载入模板,返回渲染后的模板。由于这种情况十分常见,Django提供了一种快捷方式——“通用视图”系统

通用视图蒋昌建的模式抽象到了一种地步,不需要编写python代码就可以创建一个应用程序。

接下来,我们将投票系统使用通用视图系统,我们需要
1、转换URLconf
2、删除一些旧的、不再需要的视图
3、基于Django的通用视图引入新的视图

改良URLconf
修改 polls.url

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"),
]

我们将detail和results路径字符串匹配模式名称从<question_id>改成了。这是因为我们将使用通用视图替代原来的视图,它期望从URL中捕获的主键值被称为“pk”

3、改良视图

打开polls/views 删除index detail results视图,用通用视图代替

from django.views import generic
class IndexView(generic.ListView):template_name = "polls/index.html"context_object_name = "latest_question_list"def get_queryset(self):return Question.object.order_by("-pub_date")[:5]class DetailView(generic.DetailView):model = Questiontemplate_name = "polls/detail.html"
class ResultsView(generic.DetailView):model = Questiontemplate_name = "polls/results.html"
  • template_name属性用来告诉django使用一个指定的模板名字
    而不是自动生成的默认名字,template_name 属性允许你指定一个不同于默认命名约定的模板文件名称。通过设置这个属性,你可以让同一个通用视图类在渲染不同内容时使用不同的模板。这使得你可以为不同的视图提供不同的外观和感觉,即使它们在后台使用相同的视图类

  • 默认上下文变量名:
    DetailView 默认提供的上下文变量名是模型名的小写形式,如 question。
    ListView 默认提供的上下文变量名是模型名的小写复数形式,如 question_list。
    自定义上下文变量名:
    使用 context_object_name 属性,你可以覆盖默认的上下文变量名,使用你想要的变量名。
    这是更便捷的方法,而不是修改模板以匹配默认的上下文变量名

再次启动服务器
在这里插入图片描述
没有问题

未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3223916.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

入门PHP就来我这(高级)19 ~ 捕获sql错误

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 接着上篇我们来看下sql错误的捕获模式。 1 PDO中捕获SQL语句中的错误 在PDO中有3种方法可以捕…

企业化运维(7)_Zabbix企业级监控平台

官网&#xff1a;Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution ###1.Zabbix部署### &#xff08;1&#xff09;zabbix安装 安装源 修改安装路径为清华镜像 [rootserver1 zabbix]# cd /etc/yum.repos.d/ [rootserver1 yum.repos.d]# vim zabbix.r…

嵌入式c语言——指针加修饰符

指针变量可以用修饰符来修饰

软件开发面试题(C#语言,.NET框架)

1. 解释什么是委托&#xff08;Delegate&#xff09;&#xff0c;并举例说明它在C#中的用法。 委托是一种引用类型&#xff0c;它可以用于封装一个或多个方法。委托对象可以像方法一样调用&#xff0c;甚至可以用于创建事件处理程序。委托是C#中实现事件和回调函数的重要机制。…

Proteus + Keil单片机仿真教程(五)多位LED数码管的静态显示

Proteus + Keil单片机仿真教程(五)多位LED数码管 上一章节讲解了单个数码管的静态和动态显示,这一章节将对多个数码管的静态显示进行学习,本章节主要难点: 1.锁存器的理解和使用; 2.多个数码管的接线封装方式; 3.Proteus 快速接头的使用。 第一个多位数码管示例 元件…

windows JDK11 与JDK1.8自动切换,以及切换后失效的问题

1.windows安装不同环境的jdk 2.切换jdk 3.切换失败 原因&#xff1a;这是因为当我们安装并配置好JDK11之后它会自动生成一个环境变量&#xff08;此变量我们看不到&#xff09;&#xff0c;此环境变量优先级较高&#xff0c;导致我们在切换回JDK8后系统会先读取到JDK11生成的…

vue3中使用provide跨层传值(方法)

1.使用provide inject 跨层实现 祖父组件&#xff1a; provide有两个参数&#xff0c;第一个是我们传递的key&#xff0c;第二个就是value了 孙子组件&#xff1a; const dataList inject(getDataList1)//使用inject接收 const dataList1 dataList.getDataList 页面中使…

Nuxt框架中内置组件详解及使用指南(四)

title: Nuxt框架中内置组件详解及使用指南&#xff08;四&#xff09; date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt 3框架中的两个内置组件&#xff1a;和的使用方法与示例。用于捕获并处理客户端错误&#xff0c;提供…

jvm 06 对象内存结构,指针压缩,调优

01 内存布局 mark word 32bit 4B 64bit 8B 类型指针 klass pointer 开启指针压缩 4B 关闭指针压缩 8B 数组长度 4B 没有这个区域 实例数据 bool 1B 1 true&#xff0c;0 false #define TRUE 1 byte 1B char 2B 1B int 4B float 4B long 8B double 8B 引用类型 开启指针压缩 4B …

基于STM32的气压检测报警proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的气压检测报警proteus仿真设计 1.主要功能2.仿真3. 程序4. 设计报告5. 资料清单&下载链接资料下载链接&#xff1a; 基于STM32的气压检测报警proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言…

Python实现吃豆人游戏详解(内附完整代码)

一、吃豆人游戏背景 吃豆人是一款由Namco公司在1980年推出的经典街机游戏。游戏的主角是一个黄色的小圆点&#xff0c;它必须在迷宫中吃掉所有的点数&#xff0c;同时避免被四处游荡的幽灵捉到。如果玩家能够吃掉所有的点数&#xff0c;并且成功避开幽灵&#xff0c;就可以进入…

【多线程】wait()和notify()

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 为什么需要wait()方法和notify()方法&#xff1f;2. wait()方法2.1 wait()方法的作用2.2 wait()做的事情2…

一文带你彻底搞懂什么是责任链模式!!

文章目录 什么是责任链模式&#xff1f;详细示例SpingMVC 中的责任链模式使用总结 什么是责任链模式&#xff1f; 在我们日常生活中&#xff0c;经常会出现一种场景&#xff1a;一个请求需要经过多个对象的处理才能得到最终的结果。比如&#xff0c;一个请假申请&#xff0c;需…

保姆级教程:Linux (Ubuntu) 部署流光卡片开源 API

流光卡片 API 开源地址 Github&#xff1a;https://github.com/ygh3279799773/streamer-card 流光卡片 API 开源地址 Gitee&#xff1a;https://gitee.com/y-gh/streamer-card 流光卡片在线使用地址&#xff1a;https://fireflycard.shushiai.com/ 等等&#xff0c;你说你不…

如何在Excel中对一个或多个条件求和?

在Excel中&#xff0c;基于一个或多个条件的求和值是我们大多数人的常见任务&#xff0c;SUMIF函数可以帮助我们根据一个条件快速求和&#xff0c;而SUMIFS函数可以帮助我们对多个条件求和。 本文&#xff0c;我将描述如何在Excel中对一个或多个条件求和&#xff1f; 在Excel中…

2020 ICPC Shanghai Site B. Mine Sweeper II 题解 构造 鸽巢原理

Mine Sweeper II 题目描述 A mine-sweeper map X X X can be expressed as an n m n\times m nm grid. Each cell of the grid is either a mine cell or a non-mine cell. A mine cell has no number on it. Each non-mine cell has a number representing the number of…

gif压缩大小但不改变画质的最佳方法,7个gif压缩免费工具别错过!

你会不会也碰到过当你需要在自媒体平台上上传gif文件时&#xff0c;你会发现网页端最大限制为15MB&#xff0c;而手机端最大限制为5MB。那么如何在不不改变画质的同时压缩gif大小呢&#xff1f;如今&#xff0c;由于其特殊的动画以及快速传输的特点&#xff0c;gif文件已经成为…

原创作品—数据可视化大屏

设计数据可视化大屏时&#xff0c;用户体验方面需注重以下几点&#xff1a;首先&#xff0c;确保大屏信息层次分明&#xff0c;主要数据突出显示&#xff0c;次要信息适当弱化&#xff0c;帮助用户快速捕捉关键信息。其次&#xff0c;设计应直观易懂&#xff0c;避免复杂难懂的…

Zabbix自动发现

目录 自动发现的主要特点包括&#xff1a; 如何配置自动发现&#xff1a; 实验步骤 1. 创建自动发现规则 2. 给自动发现规则创建动作 3. 给新主机安装agent 在 Zabbix 中&#xff0c;自动发现&#xff08;Auto Discovery&#xff09;是一种强大的功能&#xff0c;用于自…

jmeter持续学习之----性能初级一些概念和指标

服务端为什么要进行性能测试 大量用户下&#xff0c;系统能否稳定运行&#xff08;比较多&#xff09; 用于硬件服务器的选型 用于软件技术的选型 性能测试关注的点 用户角度:响应时间 资源占用:并发用户数,TPS,资源占用(cpu,内存,JVM) 性能测试策略 基准测试:单用户测试,对…