Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Django 常用的Form表单

Django 常用的Form表单

作者头像
微软技术分享
发布于 2022-12-28 08:48:13
发布于 2022-12-28 08:48:13
1.2K00
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django 之Form表单的常用操作
普通Form表单的提交 <!-- 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 }}<
微软技术分享
2022/12/28
1.2K0
Django form表单
Form介绍   之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确,如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误消息。   Django form组建就实现了上面所述的功能。   总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 普通的登录 views.py de
新人小试
2018/04/12
3.6K0
Django之Form表单
Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示显示对应的错误信息.。 Django form组件就实现了上面所述的功能。 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 Django For
人生不如戏
2018/04/12
2.8K0
Django form表单
form表单的作用:   1.生成HTML代码   2.验证   3.把验证的错误显示在页面上并保留原始数据 form表单的基本使用: form_obj生成HTML代码的方式   1.form_obj.as_p   2.自己挨个字段取   3.{% for field in form_obj %}   {{field.label}}   {{field}}   {% endfor %}
py3study
2020/01/19
4.3K0
Django form表单
Django-form表单
构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字。你需要类似这样的模板: ? 1 2 3 4 5 <form action="/your-name/" method="post"
用户1214487
2018/01/24
4K0
Django Web开发基础知识
MVC - Model View Controller,模型(model)-视图(view)-控制器(controller)的缩写,是软件工程中的一种软件架构模式,Model模型中主要用于存储与数据库相关的字段或数据库通信方面的东西,Controller控制器用于存储URL的分发等,最后的View视图则是完善控制器中的路径分发,每一个路径对应一个view视图函数。
微软技术分享
2022/12/28
2.2K0
Django Web开发基础知识
12.Django基础十之Form和ModelForm组件
  我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
changxin7
2019/10/08
3.4K0
Django之Form组件
  我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
py3study
2020/01/17
1.1K0
Django学习笔记之Django Form表单详解
这是一个非常简单的表单。实际应用中,一个表单可能包含几十上百个字段,其中大部分需要预填充,而且我们预料到用户将来回编辑-提交几次才能完成操作。
Jetpropelledsnake21
2018/08/01
4.6K0
Form和ModelForm组件
我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。
py3study
2020/01/16
5K0
Django之forms组件
  我们在写注册页面时,之前只是提交了数据,然后就保存了数据,后端根本就没有对数据进行校验,比如价格写的不是纯数字也让保存,这肯定是不行的,在前端是可以校验的,但我们不能只依靠前端验证,万一前端不校验,那整个过程就没校验了,所以,不管前端有没有校验,我们后端都应该进行验证。
py3study
2020/01/21
2.2K0
多对多关系表的创建方式、forms组件
through_fields:指定第三张表中哪两个字段维护表与表之间的多对多关系(这里有先后顺序,外键建在谁那里就先写谁)
GH
2019/12/16
5.2K0
多对多关系表的创建方式、forms组件
32.Django form组件
Form组件  Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML; 1.内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None,
zhang_derek
2018/04/11
3.1K0
Django教程(三)- Django表单Form1.Form 基本使用2.Form中字段及插件3.通过Django表单Form来完成需求4.自定义验证验证规则
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
Python攻城狮
2018/08/23
10.2K0
Django教程(三)- Django表单Form1.Form 基本使用2.Form中字段及插件3.通过Django表单Form来完成需求4.自定义验证验证规则
Django Form组件
需要注意的是,foo.errors返回的是li标签,是多个,想看单个字段的错误信息要指定
HammerZe
2022/03/25
7070
Django Form组件
django 的form规则组件的笔记(附代码)
error_messages属性是键值对的形式,键是和其他属性一样,值就是自定义的错误信息
一写代码就开心
2022/06/05
9800
django 的form规则组件的笔记(附代码)
Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
写法和写模型表类极其相似,但是 forms 组件的字段有约束,模型表类的字段没有约束 from django import forms class LoginForm(forms.Form): username = forms.CharField(max_length=8,min_length=3) # 用户名最长八位最短三位 password = forms.CharField(max_length=8,min_length=5) # 密码最长八位最短五位 email = forms.EmailField() # email必须是邮箱格式
suwanbin
2019/09/26
2.8K0
Django-多对多关系的三种创建方式-forms组件使用-cookie与session-08
Django-Form表单(验证、定制、错误信息、Select)
封装到类的对象里,obj=UserInfo(request.POST)
菲宇
2019/06/13
2.2K0
Django-Form表单(验证、定制、错误信息、Select)
Django—Form、ModelFor
一、Form form.py from django import forms from django.core.exceptions import ValidationError from django.contrib.auth.models import User import re # 定义手机号验证规则 def phone_validate(value): phone = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[
py3study
2020/01/16
9710
django-forms组件
08.19自我总结 django-forms组件 一.forms的作用 前端和后端都要校验 前端校验的目的:减少后台代码连接数据库的压力 用forms可以同时完成前端和后端同时校验且减少代码量 二.forms的基本使用: 1.定义数据的时候导入from类 2.字段通过fields进行导入 3.演示 views.py from django.forms import Form from django.forms import fields class LoginForm(Form): ### 全部都是
小小咸鱼YwY
2019/09/11
9750
相关推荐
Django 之Form表单的常用操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验