Django—Form、ModelForm
一、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[57])[0-9]{8}$')
- if not phone.match(value):
- raise ValidationError("手机号格式错误")
- class RegForm(forms.Form):
- username = forms.CharField(
- label="用户名",
- min_length=6,
- initial="请输入用户名",
- error_messages={
- 'required': "不能为空",
- "invalid": "格式错误",
- "min_length": "用户名最短6位"
- },
- widget=forms.widgets.TextInput(attrs={"class": "form-control"})
- )
- password = forms.CharField(
- label="密码",
- min_length=8,
- widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
- error_messages={
- "required": "不能为空",
- "min_length": "不能少于8位"
- }
- )
- re_password = forms.CharField(
- label="密码",
- min_length=8,
- widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
- error_messages={
- "required": "不能为空",
- "min_length": "不能少于8位"
- }
- )
- email = forms.EmailField(
- label="邮箱",
- widget=forms.widgets.TextInput(attrs={"class": "form-control"}),
- error_messages={
- 'required': "不能为空",
- "invalid": "格式错误",
- }
- )
- # radio
- gender = forms.fields.ChoiceField(
- choices=((1,"男"),(0,"女"),),
- label="性别",
- initial=1,
- widget=forms.widgets.RadioSelect()
- )
- # 单选select
- se_hobby = forms.fields.ChoiceField(
- label="select单选爱好",
- choices=((1,"篮球"),(2,"网球"),(3,"羽毛球"),),
- # initial=1,
- widget=forms.widgets.Select()
- )
- # 多选select
- se_hobbys = forms.fields.MultipleChoiceField(
- label="select多选爱好",
- choices=((1, "篮球"), (2, "网球"), (3, "羽毛球"),),
- initial=[1,],
- widget=forms.widgets.SelectMultiple()
- )
- # 单选checkbox
- keep_username = forms.fields.ChoiceField(
- label="记住用户名",
- # initial="checked",
- widget=forms.widgets.CheckboxInput()
- )
- # 多选checkbox
- ch_hobbys = forms.fields.MultipleChoiceField(
- label="checkbox多选爱好",
- choices=((1, "篮球"), (2, "网球"), (3, "羽毛球"),),
- # initial=[1, 2],
- widget=forms.widgets.CheckboxSelectMultiple()
- )
- # 手机号
- phone = forms.fields.CharField(
- validators=[phone_validate, ],
- error_messages={
- "required": "手机不能为空"
- },
- widget=forms.widgets.TextInput(attrs={"class": "form-control"})
- )
- # # 批量增加样式
- # def __init__(self, *args, **kwargs):
- # super(RegForm, self).__init__(*args, **kwargs)
- # for field in iter(self.fields):
- # self.fields[field].widget.attrs.update({
- # 'class': 'form-control'
- # })
- #
- # # 动态获取数据库的choice数据
- # self.fields["gender"].choices = User.objects.all().values_list("id", "gender")
- # 重写全局的钩子函数,对确认密码做校验
- def clean(self):
- password = self.cleaned_data.get("password")
- re_password = self.cleaned_data.get("re_password")
- if re_password and re_password != password:
- self.add_error("re_password", ValidationError("两次输入的密码不一致"))
- else:
- return self.cleaned_data
- # 定义局部钩子,验证用户名是否被注册
- def clean_username(self):
- username = self.cleaned_data.get("username")
- is_exist = User.objects.filter(username=username)
- if is_exist:
- self.add_error("username", ValidationError("用户名已被注册"))
- else:
- return username
- # 定义局部钩子,验证邮箱是否可用
- def clean_email(self):
- email = self.cleaned_data.get("email")
- is_exist = User.objects.filter(email=email)
- if is_exist:
- self.add_error("email", ValidationError("邮箱不可用"))
- else:
- return email
view.py
- def reg(request):
- form_obj = RegForm()
- if request.method == "POST":
- ret = {"status": 0, "msg": ""}
- form_obj = RegForm(request.POST)
- if form_obj.is_valid():
- # form_obj.cleaned_data.pop("re_password")
- # print(form_obj.cleaned_data)
- # User.objects.create_user(**form_obj.cleaned_data)
- ret["msg"] = "/login"
- return JsonResponse(ret)
- else:
- # print(form_obj.errors)
- ret["status"] = 1
- ret["msg"] = form_obj.errors
- return JsonResponse(ret)
- return render(request, 'register.html', {"forms_obj": form_obj})
register.html
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <meta http-equiv='Content-type' content='text/htm'>
- <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
- <script src="/static/jquery-3.3.1.js"></script>
- <script src="/static/bootstrap/js/bootstrap.min.js"></script>
- </head>
- <body>
- <div class="container">
- <div class="row">
- <div class="col-md-6 col-md-offset-3 reg-form">
- <h3 class="text-center">Register</h3><br>
- <form class="form-horizontal" novalidate method="post"
- enctype="multipart/form-data">
- {% csrf_token %}
- <div class="form-group ">
- <label for='{{ forms_obj.username.id_for_label }}'
- class="col-sm-2 control-label">{{ forms_obj.username.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.username }}
- <span class="help-block">{{ forms_obj.username.errors.0 }}</span>
- <span id="ss" class="help-block"></span>
- </div>
- </div>
- <div class="form-group ">
- <label for='{{ forms_obj.password.id_for_label }}'
- class="col-sm-2 control-label">{{ forms_obj.password.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.password }}
- <span class="help-block">{{ forms_obj.password.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group ">
- <label for='{{ forms_obj.re_password.id_for_label }}'
- class="col-sm-2 control-label">{{ forms_obj.re_password.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.re_password }}
- <span class="help-block">{{ forms_obj.re_password.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.email.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.email.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.email }}
- <span class="help-block">{{ forms_obj.email.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.gender.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.gender.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.gender }}
- <span class="help-block">{{ forms_obj.gender.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.se_hobby.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.se_hobby.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.se_hobby }}
- <span class="help-block">{{ forms_obj.se_hobby.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.se_hobbys.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.se_hobbys.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.se_hobbys }}
- <span class="help-block">{{ forms_obj.se_hobbys.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.keep_username.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.keep_username.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.keep_username }}
- <span class="help-block">{{ forms_obj.keep_username.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.ch_hobbys.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.ch_hobbys.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.ch_hobbys }}
- <span class="help-block">{{ forms_obj.ch_hobbys.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.phone.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.phone.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.phone }}
- <span class="help-block">{{ forms_obj.phone.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <div class="col-sm-offset-3 col-sm-6">
- <button id="reg_submit" type="button" class="btn btn-success btn-block">注册</button>
- </div>
- </div>
- </form>
- </div>
- </div>
- </div>
- <script>
- $("#reg_submit").click(function () {
- var formData = new FormData();
- formData.append("username", $("#id_username").val());
- formData.append("password", $("#id_password").val());
- formData.append("re_password", $("#id_re_password").val());
- formData.append("gender", $("input[name='gender']:checked").val());
- formData.append("se_hobby", $("#id_se_hobby").val());
- formData.append("se_hobbys", $("#id_se_hobbys").val());
- formData.append("keep_username", $("#id_keep_username").prop("checked"));
- formData.append("ch_hobbys", $("#id_ch_hobbys input[name='ch_hobbys']:checked").val());
- formData.append("phone", $("#id_phone").val());
- formData.append("csrfmiddlewaretoken", $("input[name='csrfmiddlewaretoken']").val());
- $.ajax({
- url:'/register/',
- type:'post',
- processData: false,
- contentType: false,
- data:formData,
- }).done(function (data) {
- if (data.status){
- $.each(data.msg,function (k,v) {
- $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error")
- })
- }
- else {
- window.location.href = data.msg
- }
- })
- });
- $("form input").focus(function () {
- $(this).next("span").text("").parent().parent().removeClass("has-error");
- });
- $("form select").focus(function () {
- $(this).next("span").text("").parent().parent().removeClass("has-error");
- });
- $("form input[name='ch_hobbys']").focus(function () {
- $(this).parents("ul").next("span").text("").parent().parent().removeClass("has-error");
- })
- </script>
- </body>
- </html>
二、ModelForm
form.py
- from booktest.models import *
- from django.forms import widgets as wds
- class BookForm(forms.ModelForm):
- class Meta:
- model = BookInfo
- fields = "__all__"
- labels = {
- "btitle": "书名",
- "bpub_date": "发布日期",
- "bcomment": "评论量",
- "bread": "阅读量"
- }
- widgets = {
- "btitle": wds.TextInput(attrs={"class": "form-control"}),
- "bpub_date": wds.TextInput(attrs={"class": "form-control", "type": "date"}),
- "bread": wds.TextInput(attrs={"class": "form-control"}),
- "bcomment": wds.TextInput(attrs={"class": "form-control"})
- }
- error_messages = {
- "btitle": {"required":"不能为空",},
- "bpub_date": {"required":"不能为空",},
- "bcomment": {"required":"不能为空",},
- "bread": {"required":"不能为空",}
- }
view.py(add_book)
- def add_book(request):
- form_obj = BookForm()
- if request.method == "POST":
- ret = {"status": 0, "msg": ""}
- form_obj = BookForm(data=request.POST)
- if form_obj.is_valid():
- print(form_obj.cleaned_data)
- form_obj.save()
- ret["msg"] = '/bookform'
- return JsonResponse(ret)
- else:
- ret["status"] = 1
- ret["msg"] = form_obj.errors
- return JsonResponse(ret)
- return render(request, 'add_book.html', {"forms_obj": form_obj})
add_book.html
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <meta http-equiv='Content-type' content='text/htm'>
- <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
- <script src="/static/jquery-3.3.1.js"></script>
- <script src="/static/bootstrap/js/bootstrap.min.js"></script>
- </head>
- <body>
- <div class="container">
- <div class="row">
- <div class="col-md-6 col-md-offset-3 reg-form">
- <h3 class="text-center"></h3><br>
- <form class="form-horizontal" novalidate method="post"
- enctype="multipart/form-data">
- {% csrf_token %}
- <div class="form-group ">
- <label for='{{ forms_obj.btitle.id_for_label }}'
- class="col-sm-2 control-label">{{ forms_obj.btitle.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.btitle }}
- <span class="help-block">{{ forms_obj.btitle.errors.0 }}</span>
- <span id="ss" class="help-block"></span>
- </div>
- </div>
- <div class="form-group ">
- <label for='{{ forms_obj.bpub_date.id_for_label }}'
- class="col-sm-2 control-label">{{ forms_obj.bpub_date.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.bpub_date }}
- <span class="help-block">{{ forms_obj.bpub_date.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group ">
- <label for='{{ forms_obj.bcomment.id_for_label }}'
- class="col-sm-2 control-label">{{ forms_obj.bcomment.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.bcomment }}
- <span class="help-block">{{ forms_obj.bcomment.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <label for="{{ forms_obj.bread.id_for_label }}"
- class="col-sm-2 control-label">{{ forms_obj.bread.label }}</label>
- <div class="col-sm-8">
- {{ forms_obj.bread }}
- <span class="help-block">{{ forms_obj.bread.errors.0 }}</span>
- </div>
- </div>
- <div class="form-group">
- <div class="col-sm-offset-3 col-sm-6">
- <button id="reg_submit" type="button" class="btn btn-success btn-block">注册</button>
- </div>
- </div>
- </form>
- </div>
- </div>
- </div>
- <script>
- $("#reg_submit").click(function () {
- var formData = new FormData();
- formData.append("btitle", $("#id_btitle").val());
- formData.append("bpub_date", $("#id_bpub_date").val());
- formData.append("bcomment", $("#id_bcomment").val());
- formData.append("bread", $("#id_bread").val());
- formData.append("csrfmiddlewaretoken", $("input[name='csrfmiddlewaretoken']").val());
- $.ajax({
- url:'/bookform/',
- type:'post',
- processData: false,
- contentType: false,
- data:formData,
- }).done(function (data) {
- if (data.status){
- $.each(data.msg,function (k,v) {
- $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error")
- })
- }
- else {
- window.location.href = data.msg
- }
- })
- });
- $("form input").focus(function () {
- $(this).next("span").text("").parent().parent().removeClass("has-error");
- });
- </script>
- </body>
- </html>
view.py(edit_book)
- def editbook(request, book_id):
- edit_book = BookInfo.objects.get(id=book_id)
- if request.method == "POST":
- form_obj = BookForm(request.POST, instance=edit_book)
- if form_obj.is_valid():
- form_obj.save() # edit_book.update(request.POST)
- return redirect('/add_book')
- else:
- form_obj = BookForm(instance=edit_book)
- return render(request, 'edit_book.html', locals())
edit_book.html
- <body>
- <form method="post">
- {% csrf_token %}
- {% for field in form_obj %}
- <div>
- {{ field.label }}
- {{ field }}<span>{{ field.errors.0 }}</span>
- </div>
- {% endfor %}
- <input type="submit">
- </form>
- </body>
Django—Form、ModelForm的更多相关文章
- Django之Form、ModelForm 组件
Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...
- Django之Model、Form、ModelForm区别
本节内容: 1:Model https://www.cnblogs.com/shuai1991/p/10844662.html 2:Form ...
- Model、Form、ModelForm的比较
Model.Form.ModelForm 本节内容: 1:Model 2:Form 3:Model Form 1 2 3 http://www.cnblogs.com/wupeiqi/articles ...
- Django 中的Form、ModelForm
一.ModelForm 源码 class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): pass def modelform_fact ...
- python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)
一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...
- Django Form and Modelform Admin定义 高级查询)
Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...
- Django Form和ModelForm组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django - Form和ModelForm
[TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...
- Django Form and ModelForm
Form介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...
随机推荐
- 内部yum仓库制作
有些安装收到网络隔离(申请一个到DMZ区的通行证很困难) 使用yum的命令工具,在有网络环境下同步我们的yum仓库,并用http服务器代理和制作repo源进行内部安装. 实操: [root@maste ...
- Fedora 24系统基本命令
Fedora 24基本命令 一. DNF软件管理 1. 修改配置:在/etc/dnf/dnf.conf中加入fastestmirror=true.keepcache=true ...
- 入坑MATLAB必会的吐血总结
本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可. 此文用来存个档,便于回顾. 由于matlab各版本部分语法存在差异 ...
- 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)
思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...
- 【洛谷P3649】回文串
题目大意:给定一个长度为 N 的字符串,定义一个变量为该字符串的回文子串长度乘以该字串出现的次数,求这个变量的最大值是多少. 题解:学会了回文自动机. 回文自动机是两棵树组成的森林结构,并通过 fai ...
- 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解
转载声明:本文为转载文章,发表于nebulaf91的csdn博客.欢迎转载,但请务必保留本信息,注明文章出处. 原文作者: nebulaf91 原文原始地址:http://blog.csdn.net/ ...
- git最基础操作一
1. 从远端克隆:git clone -b 克隆的分支 git的地址( eg:git clone -b master https://gitee.com/test/test.git ) 2.提交修改的 ...
- freetype之PC机体验
目录 freetype之PC机体验 引入 中文教程 官方教程 代码结构 字体概念 PC上安装 官方例子 宽字符保存显示中文 坐标框架体系 字符坐标信息获取 title: freetype之PC机体验 ...
- TCP/IP详解(包含ack,seq)
前言 个人认为在web开发中,对于TCP/IP协议的理解是首当其冲的,在大多数框架的冲击下,使我们淡化了对于TCP/IP协议的理解. 理解好TCP/IP对于每个web开发者都是很有必要的. TCP/I ...
- C语言 内存管理(转)
转自 https://blog.csdn.net/u011616739/article/details/61621815 C语言 内存管理 1.内存分区 C源代码进过预处理.编译.汇编和链接4步生成 ...