4:表单和通用视图

news2024/10/3 10:33:13

表单和通用视图

  • 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")+1
        selected_choice.save()
        #重定向到结果页面,生成结果页面的URL
        return 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 = Question
    template_name = "polls/detail.html"
class ResultsView(generic.DetailView):
    model = Question
    template_name = "polls/results.html"
  • template_name属性用来告诉django使用一个指定的模板名字
    而不是自动生成的默认名字,template_name 属性允许你指定一个不同于默认命名约定的模板文件名称。通过设置这个属性,你可以让同一个通用视图类在渲染不同内容时使用不同的模板。这使得你可以为不同的视图提供不同的外观和感觉,即使它们在后台使用相同的视图类

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

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

未完待续…

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

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

相关文章

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

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

谷歌云 | Gemini 大模型赋能 BigQuery 情感分析:解码客户评论,洞悉市场风向

情感分析是企业洞察客户需求和改进产品服务的重要工具。近年来&#xff0c;随着自然语言处理 (NLP) 技术的飞速发展&#xff0c;情感分析变得更加精准高效。Google 推出的 Gemini 模型&#xff0c;作为大型语言模型 (LLM) 的代表&#xff0c;拥有强大的文本处理能力&#xff0c…

共生与变革:AI在开发者世界的角色深度剖析

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的概念&#xff0c;而是逐步渗透到我们工作与生活的每一个角落。对于开发者这一群体而言&#xff0c;AI的崛起既带来了前所未有的机遇&#xff0c;也引发了关于其角色定位的深刻讨论——AI…

electron在VSCode和IDEA及webStrom等编辑器控制台打印日志乱码

window10环境下设置 1.打开Windows设置 2.打开时间和语言&#xff0c;选择语言菜单、如何点击管理语言设置 3.打开之后选择管理&#xff0c;选择更改系统区域设置&#xff0c;把Beta版&#xff1a;使用Unicode UTF-8提供全球语言支持 勾上&#xff0c;点击确定&#xff0c;…

氛围感视频素材高级感的去哪里找啊?带氛围感的素材网站库分享

亲爱的创作者们&#xff0c;大家好&#xff01;今天我们来聊聊视频创作中至关重要的一点——氛围感。一个好的视频&#xff0c;不仅要有视觉冲击力&#xff0c;还要能够触动观众的情感。那我们应该去哪里寻找这些充满氛围感且高级的视频素材呢&#xff1f;别急&#xff0c;我这…

isaac sim 与 WLS2 ros2实现通信

Omniverse以及isaac还是windows下使用顺手一点&#xff0c;但是做跟ros相关的开发时候&#xff0c;基本就得迁移到ubuntu下了&#xff0c;windows下ros安装还是过于复杂&#xff0c;那不想用双系统或者ubuntu或者虚拟机&#xff0c;有啥别的好方法呢&#xff1f;这里想到了wind…

希喂、鲜朗和牧野奇迹主食冻干怎么样?第一次喂冻干哪款更好

我是个宠物医生&#xff0c;每天很长时间都在跟猫猫狗狗打交道&#xff0c;送到店里来的猫猫状态几乎是一眼就能看出来&#xff0c;肥胖、肝损伤真是现在大部分家养猫正面临的&#xff0c;靠送医治疗只能减缓无法根治&#xff0c;根本在于铲屎官的喂养方式。 从业这几年&#…

打开ps提示dll文件丢失如何解决?教你几种靠谱的方法

在日常使用电脑过程中&#xff0c;由于不当操作&#xff0c;dll文件丢失是一种常见现象。当dll文件丢失时&#xff0c;程序将无法正常运行&#xff0c;比如ps&#xff0c;pr等待软件。此时&#xff0c;我们需要对其进行修复以恢复其功能&#xff0c;下面我们一起来了解一下出现…

EtherCAT总线冗余让制造更安全更可靠更智能

冗余定义 什么是总线冗余功能&#xff1f;我们都知道&#xff0c;EtherCAT现场总线具有灵活的拓扑结构&#xff0c;设备间支持线型、星型、树型的连接方式&#xff0c;其中线型结构简单、传输效率高&#xff0c;大多数的现场应用中也是使用这种连接方式&#xff0c;如下图所示…

MiniGPT-Med 通用医学视觉大模型:生成医学报告 + 视觉问答 + 医学疾病识别

MiniGPT-Med 通用医学视觉大模型&#xff1a;生成医学报告 视觉问答 医学疾病识别 提出背景解法拆解 论文&#xff1a;https://arxiv.org/pdf/2407.04106 代码&#xff1a;https://github.com/Vision-CAIR/MiniGPT-Med 提出背景 近年来&#xff0c;人工智能&#xff08;AI…

单链表(C语言详细版)

1. 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应减少&#xff0c;旺季时车次的车厢会额外增加几节。…

Java面试八股之描述一下MySQL使用索引查询数据的过程

描述一下MySQL使用索引查询数据的过程 1.解析查询语句与查询优化 用户提交一个 SQL 查询语句&#xff0c;MySQL 的查询解析器对其进行词法分析和语法分析&#xff0c;生成解析树。 查询优化器根据解析树、表结构信息、统计信息以及索引信息&#xff0c;决定是否使用 B树索引…

解锁AI大模型潜能:预训练、迁移学习与中间件编程的协同艺术

在人工智能的浩瀚星空中&#xff0c;大型预训练模型&#xff08;Large Language Models, LLMs&#xff09;犹如璀璨的星辰&#xff0c;引领着技术革新的浪潮。这些模型通过海量数据的滋养&#xff0c;学会了理解语言、生成文本乃至执行复杂任务的能力。然而&#xff0c;要让这些…

符号同步、定时同步和载波同步

符号同步、定时同步和载波同步是通信系统中重要的同步技术&#xff0c;它们各自承担着不同的功能和作用。以下是对这三种同步技术的详细解释&#xff1a; 符号同步 定义&#xff1a; 符号同步&#xff0c;也称为定时恢复或时钟恢复&#xff0c;是指在数字通信系统中&#xff…

mysql 5.7.44 32位 zip安装

前言 因为研究别人代码&#xff0c;他使用了5.7的 32位 mysql &#xff0c;同时最新的 8.4 64位 mysql 不能用官方lib连接。所以安装这个版本使用&#xff0c;期间有些坑&#xff0c;在这里记录一下。 下载路径 mysql官方路径&#xff1a;https://downloads.mysql.com/archi…

更深入了解汽车与航空电子等安全关键型应用的IP核考量因素

作者&#xff1a;Philipp Jacobsohn&#xff0c;SmartDV高级应用工程师 中国已经连续十多年成为全球第一大汽车产销国&#xff0c;智能化也成为了汽车行业发展的一个重要方向&#xff0c;同时越来越多的制造商正在考虑进入无人机和飞行汽车等低空设备&#xff0c;而所有的这些…

一周IT资讯 | B站、小红书等应用崩溃,系阿里云服务器异常所致;余承东回西工大演讲,网友:“史上最强招生guang告”

4.B站、小红书等应用崩溃&#xff0c;系阿里云服务器异常所致 7月2日上午&#xff0c;“B站崩了”“小红书崩了”等话题登上热搜。B站APP无法使用浏览历史关注等内容&#xff0c;消息界面、更新界面、客服界面均不可用&#xff0c;用户也无法评论和发弹幕&#xff0c;视频评论…

React+TS前台项目实战(二十六)-- 高性能可配置Echarts图表组件封装

文章目录 前言CommonChart组件1. 功能分析2. 代码详细注释3. 使用到的全局hook代码4. 使用方式5. 效果展示 总结 前言 Echarts图表在项目中经常用到&#xff0c;然而&#xff0c;重复编写初始化&#xff0c;更新&#xff0c;以及清除实例等动作对于开发人员来说是一种浪费时间…

浏览器开发者视角及CSS表达式选择元素

点击想要查看的接口&#xff0c;然后点击检查&#xff0c;便可以切换到该接口对应的html代码 如果F12不起作用的话&#xff0c;点击更多工具&#xff0c;然后选择开发者工具即可 ctrlF可以去查阅相关的CSS表达式选择元素 如果没有加#t1&#xff0c;那么表示的是选择所有的p 使用…

对比学习和多模态任务

1. 对比学习 对比学习&#xff08;Contrastive Learning&#xff09;是一种自监督学习的方法&#xff0c;旨在通过比较数据表示空间中的不同样本来学习有用的特征表示。其核心思想是通过最大化同类样本之间的相似性&#xff08;或降低它们之间的距离&#xff09;&#xff0c;同…