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")+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 属性,你可以覆盖默认的上下文变量名,使用你想要的变量名。
    这是更便捷的方法,而不是修改模板以匹配默认的上下文变量名

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

未完待续…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Github绑定自己的域名

Github绑定自己的域名 1.注册自己的域名2.在GitHUb上创建一个自己的仓库&#xff0c;添加域名2.1 创建仓库2.2 添加域名2.3 在Setting中将域名添加到Custom domain中 3.添加域名解析获取ip地址4.在阿里云修改域名解析记录5.ping 域名即可成功 详细内容可参该博客&#xff1a; …

AutoHotKey自动热键(五)添加WINDOWS秘笈指令-输入瞬间启动功能

在AUTOHOTKEY的使用中,不仅仅可以监听组合热键,还可以监听正常文本击键录入,这是另一种监听方式,比如依次击键jsq之后直接弹出<计算器>工具,或者依次击键sj之后直接输出135****5564的手机号码,等等,这就是autohotkey的录入击键监听,以双冒号为开头:: 因这种录入监听像极了…

Word文件打开密码设置:掌握这两种方法,保护你的文档安全

在日常工作和学习中&#xff0c;我们经常会使用Microsoft Word来创建和编辑文档。有时候&#xff0c;为了保护文档内容不被未经授权的人员查看或修改&#xff0c;我们通常会采用加密的方式来增加其安全性。那么Word文档怎么加密&#xff1f; 方法一&#xff1a;使用Word软件内置…

CTF php RCE (一)

0x01 引言 首先进入题目 应该是大部分都是一段白盒PHP审计&#xff0c;然后我们为了命令执行&#xff0c;绕过或者是钻空子等等操作&#xff0c;来拿到flag 0x02 基础 0x01 传参方式 这里有两个工具&#xff0c;hackbar和burpsuite,这两个工具非常实用 大家可以自己Googl…

力扣第一题

1. 两数之和 提示 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可…

OpenFWI代码

重点关注文章第4部分 一、代码模块概览 这一部分了解代码主要实现的功能有哪些。 二、运行 这一部分关注如何跑通。 三、数据集 12个数据集&#xff08;11个2D1个3D&#xff09; 对计算机而言&#xff0c;上述输入、输出维度大小是按次数定义的。 以“Vel&#xff0c;F…

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码&#xff0c;但是图片已省略&#xff0c;可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…

图吧工具箱:装机爱好者必备工具合集

名人说:莫道谗言如浪深,莫言迁客似沙沉。 ——刘禹锡《浪淘沙》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、概述二、主要功能1、硬件检测2、测试与故障诊断三、使用方法四、总结很高兴你打开了这篇博客,更多好用的软件工具,请关注我、订阅专栏…

0302GPIO外设输入功能

GPIO外设输入功能 输入部分硬件电路按键简介传感器模块简介按键和传感器模块的硬件电路 C语言的学习C语言数据类型宏定义typedef结构体枚举C语言知识总结 按键控制LED灯&光敏传感器蜂鸣器GPIO总结GPIO使用方法总结模块化编程的方法&#xff1a; 两个程序&#xff1a;按键控…

图像分割-编码解码网络的训练-kreas实现

一、数据集加载&#xff1a; 纯手工打造一个函数用来加载数据&#xff0c;数据分别为image和mask 我们所需要的类型&#xff1a;&#xff08;B数量&#xff0c;长&#xff0c;宽&#xff0c;通道数&#xff09;&#xff0c;只要将数据加载成这样并mask和image对应就行。 第一步…

S271系列RTU在旅游景区人流监控中的应用案例

S271系列RTU在旅游景区人流监控中的应用案例 随着全球旅游业的迅猛发展&#xff0c;旅游景区的管理者越来越关注如何利用先进的技术手段提升游客体验、优化管理效率以及确保安全。S271系列RTU作为一款先进的无线工业物联网设备&#xff0c;在旅游景区的人流监控中展现出了其独…

PTA - 编写函数计算圆面积

题目描述&#xff1a; 1.要求编写函数getCircleArea(r)计算给定半径r的圆面积&#xff0c;函数返回圆的面积。 2.要求编写函数get_rList(n) 输入n个值放入列表并将列表返回 函数接口定义&#xff1a; getCircleArea(r); get_rList(n); 传入的参数r表示圆的半径&#xff0c…

批量下载手机中APP程序中文件

需求 利用 adb pull 下载手机中app的某目录 adb pull 命令本身不支持直接下载整个目录&#xff08;文件夹&#xff09;及其所有子目录和文件作为一个单一的操作。但是&#xff0c;可以通过一些方法来间接实现这一目的。 方法 1. 首先将要下载的目录进行 tar 打包 # 在 And…

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…

Raylib 实现超大地图放大缩小与两种模式瓦片地图刷新

原理&#xff1a; 一种刷新模式&#xff1a; 在宫格内整体刷新&#xff0c;类似九宫格移动到边缘&#xff0c;则九宫格整体平移一个宫格&#xff0c;不过这里是移动一个瓦片像素&#xff0c;实际上就是全屏刷新&#xff0c;这个上限是 笔记本 3060 70帧 100*100个瓦片每帧都…

《赌局的诱惑》-反赌反诈剧情脚本

场景1&#xff1a; 一家普通公司的休息室&#xff0c;有一张桌子&#xff0c;上面摆放着扑克牌和一些现金。墙上挂着一个时钟&#xff0c;显示时间是下午5点。 人物&#xff1a; 张伟&#xff1a;新员工&#xff0c;被同事拉入赌局。 赵刚&#xff1a;资深员工&#xff0c;赌…

UE5.3-基础蓝图类整理一

常用蓝图类整理&#xff1a; 1、获取当前关卡名&#xff1a;Get Current LevelName 2、通过关卡名打开关卡&#xff1a;Open Level(by name) 3、碰撞检测事件&#xff1a;Event ActorBeginOverlap 4、获取当前player&#xff1a;Get Player Pawn 5、判断是否相等&#xff1…

反弹球python小游戏

1.准备图片(可以替换) 2.python Pygame类 class Ls(pygame.sprite.Sprite):def __init__(self,pos):#pos 鼠标点击的位置super().__init__()self.image pygame.image.load(ji.png)self.dx2self.dx r.randint(20,500)self.image pygame.transform.scale(self.image,(self.dx…

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

iis部署前后端分离项目(React前端,Node.js后端)

iis虽然已经有点过时&#xff0c;但不少用户还在用&#xff0c;故总结一下。 1. 安装iis 如果电脑没有自带iis管理器&#xff0c;打开控制面板->程序->启用或关闭Windows功能&#xff0c;勾选iis安装即可 2. 部署前端项目 打开iis&#xff0c;添加网站&#xff0c;物理…