当前位置: 首页 > news >正文

【实战案例】Django框架表单处理及数据库交互

本文基于之前内容列表如下:
【图文指引】5分钟搭建Django轻量级框架服务
【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应
【实战案例】Django框架连接并操作数据库MySQL相关API
【实战案例】Django框架使用模板渲染视图页面及异常处理

更新编写的投票详细页面的模板"polls/detail.html"让它包含一个 form表单元素:
(超详细注释版)

<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>这是detail的模板渲染</title>
</head>
<body>
<!--action属性使用{\% url %}模板标签动态生成投票处理的URL。'polls:vote'是命名的URL模式,question.id是传递给该URL的参数(问题的ID)。-->
<!--method="post"指明表单数据通过POST请求提交,适合用于修改服务器端数据(这里是投票)-->
<form action="{% url 'polls:vote' question.id %}" method="post"><!--Django的跨站请求伪造(CSRF)保护机制。它在表单中插入一个隐藏字段,确保请求来自同一个站点,以防止恶意攻击。-->{% csrf_token %}<!--<fieldset>用于分组相关元素,通常与<legend>结合使用,提升可读性和可访问性。--><fieldset><legend><h1>{{ question.question_text }}</h1></legend><!--如果存在错误消息(如用户未选择选项),会显示在表单中。error_message是从视图传递到模板的上下文变量。-->{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}<!--这个循环遍历当前问题的所有选择项(choice_set是Django为一对多关系生成的反向关系管理器)。--><!--对于每个选择项,生成一个单选框(<input type="radio">)和对应的标签(<label>)。--><!--id="choice{\{ forloop.counter }}"为每个单选框生成唯一的ID,forloop.counter是Django模板中的内置变量,从1开始计数。--><!--value="{\{ choice.id }}"将每个单选框的值设置为选择项的ID,以便在提交表单时识别所选的选择项。-->{% 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>

之前创建的URLconf位于polls/urls.py中

path("<int:question_id>/vote/", views.vote, name="vote"),

在polls/views.py中更新如下代码:

from django.db.models import F
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reversefrom .models import Choice, Question# ...
def vote(request, question_id):# 使用 get_object_or_404 函数获取指定问题对象。如果未找到,则返回404错误页面。question = get_object_or_404(Question, pk=question_id)try:# 从POST请求中获取选中的选择项ID,并在该问题的选择集中查找对应的选择项。selected_choice = question.choice_set.get(pk=request.POST["choice"])except (KeyError, Choice.DoesNotExist):# 如果在POST请求中没有找到选择项,或选择项不存在,执行以下操作:# Redisplay the question voting form with an error message.return render(request,  # 当前请求对象"polls/detail.html",  # 渲染的模板{"question": question,  # 重新传递问题对象,以便在模板中显示"error_message": "You didn't select a choice.",  # 错误消息,提示用户未选择任何选项},)else:# 如果成功找到选中的选择项,则增加其票数selected_choice.votes = F("votes") + 1  # 使用 F 表达式进行原子操作,避免竞争条件selected_choice.save()  # 保存更新后的选择项# 返回一个 HttpResponseRedirect,以防止用户在提交后刷新页面导致重复提交return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))# 当有人对 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})

接下来创建polls/results.html模板:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>这是results的模板渲染</title>
</head>
<body>
<h1>{{ question.question_text }}</h1>
<!--<ul>标签用于创建一个无序列表-->
<!--{\% for choice in question.choice_set.all %}:这是一个循环,遍历当前问题的所有选择项。question.choice_set.all是Django的反向关系管理器,用于获取与该问题相关的所有选择项。-->
<!--vote{\{ choice.votes|pluralize }}:使用pluralize过滤器来处理单复数形式。如果得票数为1,显示“vote”,否则显示“votes”。这使得文本更自然,适应不同的得票数。-->
<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>

通过上述更新,访问http://localhost:8000/polls/可见如下页面:
在这里插入图片描述
投票页面如下所示:
在这里插入图片描述
在这里插入图片描述
选择选项并点击vote按钮可进行投票,投票后显示票数页面且可再次投票
在这里插入图片描述
对应数据库的数据也会更新
在这里插入图片描述

相关文章:

【实战案例】Django框架表单处理及数据库交互

本文基于之前内容列表如下&#xff1a; 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 【实战案例】Django框架使用模板渲染视图页面及异常处理 更新编…...

python开发工具是选择vscode还是pycharm?两款软件优缺点对照!

Pycharm和VSCode是两款流行的代码编辑器&#xff0c;它们都有各自的优缺点和适用情况。本文将从以下几个方面对它们进行比较和分析&#xff1a; 功能和扩展性性能和稳定性用户体验和界面价格和支持 功能和扩展性 Pycharm是一款专为Python开发而设计的集成开发环境&#xff08;…...

2025选题|基于Hadoop的物品租赁系统的设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

【Qt】QTableView添加下拉框过滤条件

实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …...

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…...

从可逆计算看低代码

2020年低代码&#xff08;LowCode&#xff09;这一buzzword频繁亮相于主流技术媒体&#xff0c;大背景下是微软/亚马逊/阿里/华为等巨头纷纷入场&#xff0c;推出自己的相应产品。一时之间&#xff0c;大大小小的技术山头&#xff0c;无论自己原先是搞OA/ERP/IOT/AI的&#xff…...

设计模式最佳实践代码总结 - 结构型设计模式篇 - 侨接设计模式最佳实践

目录 侨接设计模式最佳实践 侨接设计模式最佳实践 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。…...

【软件测试】python——Unittest

UnitTest 框架 笔记来自于黑马程序员python自动化测试教程&#xff0c;python从基础到Uinttest框架管理测试用例。链接&#xff1a;[黑马程序员python自动化测试教程&#xff0c;python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_i…...

Maven:详解 clean 和 install 命令的使用

clean 的主要功能是清理项目构建过程中生成的所有临时文件和输出文件。具体来说&#xff0c;clean 阶段会删除 target 目录及其所有内容。 clean 阶段的具体功能 删除 target 目录&#xff1a; target 目录是 Maven 构建过程中默认的输出目录&#xff0c;存放所有构建生成的文件…...

HTTP与RPC

一、概念 HTTP&#xff08;Hypertext Transfer Protocol,超文本传输协议&#xff09;是一种应用层协议&#xff0c;主要用于在Web服务器之间传输html页面和其他Web资源。 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用) 是一种通用的远程调用通信协议&#…...

解决蓝牙键盘按键错乱的问题

最近发现我的蓝牙键盘按下的键盘与实际不符&#xff0c;于是就上网搜索答案&#xff0c;网上的方法都试了一遍 最后想着准备退货&#xff0c;没想到客服直接给我解决了 原因很简单&#xff0c;就是之前误触了键盘的某些按键导致的 每个键盘品牌的按键因该都不同的&#xff0c;可…...

MiL.k X Biggie 奇妙宇宙来袭!

MiL.k 和亚航奖励计划联手推出 MiL.k X BIGGIE 奇妙宇宙&#xff0c;为亚航会员和 MiL.k 用户提供神奇的 Web3 体验。这款沉浸式体验位于 The Sandbox 的 MiL.k Land&#xff0c;提供趣味游戏&#xff0c;解锁令人兴奋的新奖励。 亚航吉祥物 BIGGIE 和他友好的机舱服务员将引导…...

云服务器中删除非空目录(包含文件和子目录)rm -rf <directory_name>

在云服务器中删除目录可以使用 rm 命令。如果您需要删除一个非空目录&#xff08;包含文件和子目录&#xff09;&#xff0c;可以使用以下命令&#xff1a; rm -rf <directory_name>参数解释&#xff1a; -r&#xff1a;递归删除&#xff0c;即删除目录及其所有内容&am…...

1991-2024年经管类国自然、国社科立项名单(附68份国自然标书)-最新出炉 附下载链接

很全&#xff01;1991-2024年经管类国自然、国社科立项名单&#xff08;附68份国自然标书&#xff09; 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;很全1991-2024年经管类国自然、国社科立项名单&#xff08;附68份国自然标书&#xff09;.zip 资源介…...

Flutter问题记录 - 布局中莫名其妙的白线/缝隙

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近客服反馈了一个奇怪的问题&#xff0c;有个用户反馈其他问题时给了应用截图&#xff0c;然后他发现这截图中有一条奇怪的白线。他在自己手机上没有发现这个问题&#xff0c;于是提工单反馈到我这。 开发环境 Fl…...

从零学习大模型(七)-----LoRA(中)

自注意力层中的 LoRA 应用 Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换&#xff0c;包括键&#xff08;Key&#xff09;、查询&#xff08;Query&#xff09; 和 值&#xff08;Value&#xff09; 三个权重矩阵的线…...

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…...

一家光伏企业终止,恐不具行业代表性,市占率仅为2.35%

海达光能终止原因如下&#xff1a;报告期内海达光能销售金额较所在行业第二名亚玛顿相差两倍以上&#xff0c;公司毛利率更是远低于行业龙头福莱特&#xff0c;恐难以说明公司行业代表性。在企业竞争上&#xff0c;公司2021年度的市场占有率约为2.35%&#xff0c;公司未来光伏玻…...

企业计算机监控软件是什么?6款电脑监控软件分享!提升企业管理效率,吐血推荐!

嘿&#xff0c;各位企业管理者和IT小伙伴们&#xff01; 您是否曾担忧员工在工作时间内效率低下&#xff1f;是否对公司的数据安全感到不安&#xff1f; 别担心&#xff0c;今天我们就来聊聊企业计算机监控软件&#xff0c;它就像是企业的"超级侦探"&#xff0c;帮…...

VisionPro —— CogOCRMaxTool工具详解

CogOCRMaxTool的作用&#xff1a; CogOCRMaxTool:是一个字符识别工具&#xff0c;主要用于字符识别,它能够根据已训练的字符样本读取灰度图像中的字符,并返回读取结果。 一&#xff1a;工具位置 二&#xff1a;添加图片 三&#xff1a;工具的初始页面 将识别框拖到需要识别处…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...