前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django 常用的Form表单

Django 常用的Form表单

作者头像
王 瑞
发布于 2022-12-28 08:48:13
发布于 2022-12-28 08:48:13
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

Django最强大的部分之一是自动管理界面。它从模型中读取元数据,以提供一个快速的,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容。管理员的建议用法仅限于组织的内部管理工具。它并非旨在构建您的整个前端。

实现单项选择框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form action="/index/" method="post">

    选择A:

    <select name="tag_select_a">

        {% for item in total_a %}

            <option value = "{{ item }}"> {{ item }} </option>

        {% endfor %}
    </select>
    选择B:
    <select name="tag_select_b">
        {% for item in total_b %}
            <option value = "{{ item }}"> {{ item }} </option>
        {% endfor %}
    </select>
    <input type="submit" value="提交选择">
</form>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def index(request):
    if request.method == "GET":
        tag_select_a = ["HTML", "CSS", "JAVASCRIPT", "Python", "JQuery"]
        tag_select_b = ["MySQL","Oracle","MSSQL"]
        return render(request, "index.html", {"total_a": tag_select_a,"total_b": tag_select_b})
    elif request.method == "POST":
        select_a = request.POST.get("tag_select_a")
        select_b = request.POST.get("tag_select_b")
        return HttpResponse("选择A: {} 选择B: {}".format(select_a,select_b))<b>普通Form表单的提交</b>

提交账号密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- name:index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/" method="post">
        <p>账号:<input type="text" name="username"><span>{{ error.username }}</span></p>
        <p>密码:<input type="password" name="password"><span>{{ error.password }}</span></p>
        <input type="submit" value="提交请求">
    </form>
</body>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: views.py
from django.shortcuts import render,HttpResponse

def index(request):
    if request.method == "GET":
        return render(request,"index.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        error = {"username":"","password":""}
        if len(username) > 10:
            error["username"]="用户名不能大于10"
        if len(password) < 5:
            error["password"] = "密码不能小于5"
        return render(request,"index.html",{"error":error})

Form实现登录表单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--name:index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/" method="post" novalidate>
        <p>账号: {{ form.username }} {{ form.username.errors.0 }}</p>
        <p>密码: {{ form.password }} {{ form.errors.password }}</p>
        <p>重复: {{ form.RepeatPass }} {{ form.errors.RepeatPass }}</p>
        <input type="submit" value="提交">
    </form>
</body>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name:views.py
from django.shortcuts import render,HttpResponse
from django.forms import Form,fields,widgets
from django.core.exceptions import ValidationError

class LoginForm(Form):
    username = fields.CharField(
        required = True,
        max_length = 10,
        error_messages={"required":"该字段不能为空"},
        widget=widgets.TextInput(attrs={"placeholder":"请输入用户名","class":"form-control"})
    )
    password = fields.CharField(
        required = True,
        max_length=10,
        error_messages={"required":"密码字段不能为空","min_length":"密码最小长度为5"},
        widget=widgets.PasswordInput(attrs={"placeholder":"请输入密码","class":"form-control"})
    )
    RepeatPass = fields.CharField(
        required=True,
        max_length=10,
        error_messages={"required":"密码字段不能为空","min_length":"密码最小长度为5"},
        widget=widgets.PasswordInput(attrs={"placeholder":"重复输入密码","class":"form-control"})
    )

    # 自定义方法(局部钩子)密码必须包含字母和数字
    def clean_password(self):
        if self.cleaned_data.get("password").isdigit() or self.cleaned_data.get("password").isalpha():
            raise ValidationError("密码必须包含数字和字母")
        else:
            return self.cleaned_data["password"]
    # 自定义方法(全局钩子, 检验两个字段),检验两次密码是否一致
    def clean_RepeatPass(self):
        if self.cleaned_data.get("password") != self.cleaned_data.get("RepeatPass"):
            raise ValidationError("两次输入密码不正确")
        else:
            return self.cleaned_data

def index(request):
    if request.method =="GET":
        form = LoginForm()
        return render(request, "index.html", {"form": form})
    else:
        form = LoginForm(request.POST)
        if form.is_valid():
            # username = form.data['username']
            data = form.cleaned_data
            username = data.get("username")
            password = data.get("password")
            print(username,password)
            return render(request, "index.html", {"form": form})
    return render(request, "index.html", {"form": form})

Form实现用户注册

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--name: index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form action="/" method="post">
            <p>{{ form.username.label }} {{ form.username }}</p>
            <p>{{ form.password.label }} {{ form.password }}</p>
            <p>{{ form.mobile.label }} {{ form.mobile }} </p>
            <p>{{ form.email.label }} {{ form.email }} </p>
            <p>{{ form.text }} </p>
            <p><input type="submit" value="提交请求"></p>
        </form>
    </div>
</body>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: models.py
from django.db import models

class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=64)
    password = models.CharField(max_length=32)
    mobile = models.CharField(max_length=32)
    email = models.EmailField(max_length=64)
    text = models.CharField(max_length=128)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: views.py
from django.shortcuts import render,HttpResponse
from MyWeb import models
from django.forms import Form,fields,widgets
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError

class UserForm(Form):
    username = fields.CharField(
        label = "账号: ",          # 给表单加一个标签
        required = True,           # 不允许字段为空值
        min_length=4,              # 设置最小长度
        max_length = 10,           # 设置最大长度
        validators=[ RegexValidator(r'^[0-9a-zA-Z]+$',"用户账号只能使用,0-9a-z") ],
        error_messages={"required":"该字段不能为空","invalid":"无效的用户名",
                        "min_length":"最小长度为5","max_length":"最大长度为10"},
        widget=widgets.TextInput(attrs={"placeholder":"请输入用户名","class":"form-control"})
    )
    password = fields.CharField(
        label = "密码: ",
        required = True,
        min_length=5,
        max_length=10,
        error_messages={"required":"密码字段不能为空","min_length":"密码最小长度为5"},
        widget=widgets.PasswordInput(attrs={"placeholder":"请输入密码","class":"form-control"})
    )
    mobile = fields.CharField(
        label = "手机: ",
        required=True,
        validators=[RegexValidator('[0-9]', "手机号必须是数字")],
        error_messages={"required":"该字段不能为空"},
        widget=widgets.TextInput(attrs={"placeholder": "手机号","class": "form-control"})
    )
    email = fields.EmailField(
        label="邮箱: ",
        required=True,
        error_messages={"required":"邮箱不能为空!!","invalid":"无效的邮箱"},
        widget=widgets.EmailInput(attrs={"placeholder": "邮箱", "class": "form-control"})
    )
    text = fields.CharField(
        required=True,
        widget=widgets.Textarea(attrs={"placeholder": "畅言,欢迎留言...", "class": "form-control",
                                       "style":"margin: 0px; width: 203px; height: 98px;"})
    )

def index(request):
    if request.method =="GET":
        form = UserForm()
        return render(request, "index.html", {"form": form})
    else:
        form = UserForm(request.POST)
        if form.is_valid():
            # username = form.data['username']
            data = form.cleaned_data
            username = data.get("username")

            is_exits = models.User.objects.filter(username="admin").count()
            if is_exits != 0:
                return HttpResponse("您注册的用户已存在")
            else:
                models.User.objects.create(**data)
                return HttpResponse("恭喜您的账号注册完成了")
        else:
            return render(request, "index.html", {"form": form.errors})
    return render(request, "index.html", {"form": form})

其他常用Form表单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--name: index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/" method="post">
        {% for field in form %}
            <p>{{ field.label_tag }} {{ field }} {{ field.errors.0 }}</p>
        {% endfor %}
        <input type="submit" value="提交" />
    </form>
</body>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: views.py
from django.shortcuts import render,HttpResponse
from django.forms import Form,fields,widgets

class MyForm(Form):
    hobby = fields.ChoiceField(
        label="单选框:",
        required=True,
        initial=1,                # 默认选择1号
        choices=( (1,"篮球"),(2,"足球"),(3,"乒乓球"),(4,"滚球")),
        widget=widgets.RadioSelect()
    )
    select = fields.ChoiceField(
        label="单选框(默认):",
        required=True,
        initial=1,
        choices=( (1,"篮球"),(2,"足球"),(3,"乒乓球"),(4,"滚球")),
        widget=widgets.Select()
    )
    multiple = fields.MultipleChoiceField(
        label="复选框",
        choices=((1, "篮球"), (2, "足球"), (3, "羽毛球"), (4, "排球")),
        initial=[2, 4],
        widget=widgets.SelectMultiple()
    )
    checkbox = fields.ChoiceField(
        label="单项复选框",
        initial="checked",  # 默认为勾选
        widget=widgets.CheckboxInput()
    )
    multselect = fields.MultipleChoiceField(
        label="多项复选框",
        choices=((1, "篮球"), (2, "足球"), (3, "羽毛球"), (4, "排球")),
        initial=[1, 3],
        widget=widgets.CheckboxSelectMultiple()
    )
    data = fields.DateField(
        label="选择日期",
        widget = widgets.DateInput(attrs={"type":"date"})
    )
    files = fields.FilePathField(path="./MyProject",
                                allow_folders=True,recursive=True)
    ip = fields.GenericIPAddressField(protocol="both",unpack_ipv4=False)
def index(request):
    if request.method=="GET":
        form = MyForm()
        return render(request,"index.html",{"form":form})
    else:
        form = MyForm(request.POST)
        if form.is_valid():
            data = form.cleaned_data
            print(data.get("hobby"))
    return HttpResponse("hello lyshark")

重写父类方法 通过form表单重写init方法,实现数据库动态添加,前端动态显示,以两个选择框为例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name: models.py
from django.db import models

class DBHost(models.Model):
    id = models.AutoField(primary_key=True)
    host = models.CharField(max_length=32)
    title = models.CharField(max_length=32)

# name:index.html
{{ form.title }}
{{ form.host }}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name:views.py
from django.shortcuts import render
from django.forms import Form,fields,widgets
from MyWeb import models

class DBHost(Form):
    title = fields.IntegerField(widget=widgets.Select(choices=[]))
    host = fields.IntegerField(widget=widgets.SelectMultiple(choices=[]))

    # 重写父类的 __init__ 方法
    def __init__(self,*args,**kwargs):
        super(DBHost, self).__init__(*args,**kwargs)
        self.fields['title'].widget.choices = models.DBHost.objects.all().values_list("id","title")
        self.fields['host'].widget.choices = models.DBHost.objects.all().values_list("id", "host")

def index(request):
    form = DBHost()
    return render(request,"index.html",{"form":form})

给Form表单返回数据 Form表单可以返回默认数据,我们可以通过编号查询到指定数据的默认参数,并返回到编辑框中.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# name:views.py
from django.shortcuts import render
from django.forms import Form,fields,widgets
from MyWeb import models

class MyForm(Form):
    host = fields.CharField(required=True,widget=widgets.TextInput())
    title = fields.CharField(required=True, widget=widgets.TextInput())

def index(request):
    nid = request.GET.get("id")   # 通过ID获取到记录
    qset = models.DBHost.objects.filter(id=nid).values("host","title")
    dic = qset[0]  # 转为字典

    form = MyForm(dic) # 传递到前端编辑框中
    return render(request,"index.html",{"form":form})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
linux实时文件事件监听--inotify
inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify。
sunsky
2020/08/20
13K1
Linux 结合 inotify 和 rsync 实现文件动态同步
根据 inotify 的相关知识,可以发现,很多动作都涉及了close事件,且大多数情况都是伴随着close_write事件的。所以,大多数情况下在定义监控事件时,其实并不真的需要监控open、modify、close事件。特别是close,只需监控它的分支事件close_write和close_nowrite即可。由于一般情况下inotify都是为了监控文件的增删改,不会监控它的访问,所以一般只需监控close_write即可。
为为为什么
2022/08/06
2.1K0
Shell 监控文件变化
文件监控可以配合rsync实现文件自动同步,例如监听某个目录,当文件变化时,使用rsync命令将变化的文件同步。(可用于代码自动发布)
释然IT杂谈
2022/10/27
1.5K0
Shell 监控文件变化
inotify+rsync实现实时同步
惨绿少年
2017/12/27
1.7K0
inotify+rsync实现实时同步
inotify-tools监控文件的变动情况
在实际的生产中,都会存在不同系统的对接问题,比如A系统将数据生产后存放到/data文件下,B系统需要监控/data文件夹下数据的变动情况,来做出调整,linux系统中inotify-tools正好可以完成系统的监控而supervise正好可以完成进程的持续监控,起到出错重启的效果。
Tim在路上
2020/08/04
7610
inotify 实时的Linux文件系统事件监控
# wget http://downloads.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
星哥玩云
2022/06/30
8390
Linux 通知 inotify
如果看到显示 max_queued_events max_user_instances max_user_watches 则说明支持inotify
为为为什么
2022/08/06
1.3K0
linux如何监控文件变化
使用nohup,其中test.sh为所执行的脚本,out.txt为输出信息的地方。
用户10002156
2023/09/12
1.2K0
linux如何监控文件变化
LINUX运维学习之综合架构篇——综合架构实时同步服务
1)需要部署好rsync守护进程服务,实现数据传输 2)需要部署好inotify服务,实现目录中数据变化监控 3)将rsync服务和inotify服务建立联系,将变化的数据进行实时备份传输
云计算小黑
2021/06/16
4390
文件监控-inotify安装与使用分享
开篇:在Linux环境开发过程中,遇到需要监控某个目录的文件是否发生变化执行相应脚本,网上了解一下,inotify完美符合需求。
恒恒
2019/04/25
5.2K0
inotify软件部署及实时同步
声明:博主使用的是CentOS6.9的系统 参考资料: https://github.com/rvoicilas/inotify-tools/wiki http://www.ibm.com/developerworks/cn/linux/l-inotifynew/ inotify--Linux 2.6内核中的文件系统变化通知机制 安装inotify须知 首先,在安装inotify软件之前一定要确认系统中,必须要存在的三个文件 [root@backup ~]# ll /proc/sys/fs/inotif
863987322
2018/01/24
8790
inotify软件部署及实时同步
rsync+inotify自动进行同步
Sync:同步 async:异步 Rsync:远程同步,可以将数据同步到多个和它能够通信的主机上。
互联网-小阿宇
2022/11/21
2080
rsync+inotify自动进行同步
rsync+inotify实现分布式集群部署
上一篇:Linux下使用ssh密钥实现无交互备份 上二篇:Linux下使用rsync实现文件备份 缘起 由于公司要对支付做压测,于是使用了公司的服务器搭建了一个简单的集群环境,但是各个节点分别部署确实有点麻烦,由此产生了一下想法,使用rsync+inotify同步部署集群项目,就是主节点项目变更会自动同步到其他集群节点上。 优点 使用rsyn工具和inotify机制相结合,可以实现触发式部署(实时同步),只要原始(主)位置的文档发生变幻,则立即启用增量推送操作,否则处于静态等待状态,这样以来,就避免了分布式
小柒2012
2018/04/13
1.4K0
rsync+inotify实现分布式集群部署
linux服务器同步利器​Rsync全介绍(付脚本)
Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快. Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试 此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具
IT运维技术圈
2023/02/02
2K0
inotify+rsync数据的实时同步
inotify可以监控同步数据服务器目录中信息的变化,采用异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件。
用户9949933
2023/02/24
5260
rsync+inotify实时同步环境部署记录
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足。 首先,rsync在同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的,并且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。 其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时
洗尽了浮华
2018/01/22
1.1K0
inotify-tools工具安装配置
Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。。
felixxue
2022/12/29
1.2K0
inotify-tools工具安装配置
Linux下使用inotify-tools实现文件监控并自动推送钉钉webhook告警
Linux下使用inotify-tools实现文件监控并自动推送钉钉webhook告警
yuanfan2012
2024/06/14
6320
Linux下使用inotify-tools实现文件监控并自动推送钉钉webhook告警
inotify-rsync文件实时同步问题记录
如图分析原因:通过ftp或者其他客户端上传一个稍大点的文件到文件同步监控目录下,inotifywait会实时监控到此目录下该文件的创建及修改,此时上传文件对文件修改可能是每1024个字节一次写入(可能更多,根据写文件客户端而定),因此在一定时间内造成了大量的并发,因为每次修改都会触发inotifywait检测到MODIFY类型的文件操作,同时也会调用rsync传输工具对该文件进行传输,在大量并发的情况下,对该文件的文件传输也会产生大量并发的传输,会造成io阻塞。 修改方案:在正常对文件的操作下,都会有CLOSE_WRITE,因此我们不需要让inotifywait监控MODIFY类型的事件,就不会触发大量并发的文件传输。 附上部分文件同步监控shell代码:
felixxue
2022/12/30
5950
inotify-rsync文件实时同步问题记录
使用 inotify 和 rsync 实现文件实时同步
在生产中有一种需求是,当目录下的文件数据发生变化时,就将数据备份到备份服务器上。实现这样的需求需要做到以下两点:
:Darwin
2023/07/05
1.9K0
推荐阅读
相关推荐
linux实时文件事件监听--inotify
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档