1. 表单字段

参考:

官方文档

Django表单字段汇总

2. 表单代码示例(forms.Form)

# form.py代码
# 获取数据库数据
choices_list = [(i+1,v['typename']) for i,v in \
enumerate(ProductType.objects.values('typename'))] # 自定义数据验证函数
def price_validate(value):
if int(value) <= 0:
print("******已进入验证******")
raise ValidationError("请输入正确价格") class ProductForm(forms.Form):
# 设置错误信息并设置样式
name = forms.CharField(max_length=20,\
label="名字",\
# 参数widget是一个forms.widget对象,起作用是是设置表单字段CSS样式
widget=forms.widgets.TextInput(attrs={"class":"c1"}),\
# 用于数据验证失败后的错误信息
error_messages={"required":"名字不能为空"}) tttype = forms.ChoiceField(choices=choices_list,\
label="产品类型",\
widget = forms.widgets.Select(attrs={"class":"type","size":"4"})) price = forms.DecimalField(max_digits=6,\
decimal_places=2,\
label="销售价格",\
# 自定义数据验证函数
validators = [price_validate])
<!-- form.html代码 -->
{% if product.errors %}
<p>
数据出差啦!出错信息:{{product.errors}}
</p>
{% else %}
<form action="" method="post">
{% csrf_token %}
<table>
{{product.as_table}}
</table>
<input type="submit" value="提交">
</form>
{% endif %}
# views.py中代码
def form_views(request):
if request.method == "GET":
product = ProductForm()
return render(request,'form.html',locals()) else:
product = ProductForm(request.POST)
if product.is_valid():
# 获取网页控件name的数据
# cleaned_data 将控件的数据进行清洗,转换成Python数据类型
name = product.cleaned_data['name']
tttype = product.cleaned_data['tttype']
price = product.cleaned_data['price']
print('*'*20,name,tttype,price) return HttpResponse('提交成功')
else:
# 将错误信息输出,error_msg试讲错误信息以json格式输出
error_msg = product.errors.as_json()
print(error_msg)
return render(request,"form.html",locals())
  • 将表单生成HTML的ul标签

    {{product.as_ul}}
  • 将表单生成HTML的p标签

    {{product.as_p}}
  • 生成单个HTML元素控件

    {{product.type}}
  • 获取表单字段的参数label属性值

    {{product.type.label}}

3. 表单插件weiget

参考:

官方文档

django中widget小部件

4. 表单代码示例(forms.ModelForm)

forms.ModelForm是在forms.Form基础上结合模型所生成的数据表单.数据表单是将模型的字段转换成表单的字段,再从表单生成HTML的元素控件,这是日常开发中常用的表单之一

# forms代码
from django import forms
from django.core.exceptions import ValidationError
from .models import * class ProductModelForm(forms.ModelForm):
# 添加模型外的表单字段
productId = forms.CharField(max_length=20,label="产品序号")
# 模型与表单设置
class Meta:
# 绑定模型
model = Product # field属性用于设置转换字段,'__all__'是将全部模型字段转换成表单字段
# fields = "__all__"
# fields = ["name","tttype","price","weight"] # exclude用于禁止模型字段转换成表单字段
exclude = ["ttype"] # label设置HTML元素控件label标签
labels = {
"name" : "产品名称",
"tttype" : "产品类型",
"price" : "产品价格",
"weight" : "产品重量"
} # 定义widgets,设置表单字段的CSS样式
widgets = {
"name" : forms.widgets.TextInput(attrs={"class":"c1"}),
"tttype" : forms.widgets.Select(attrs={"class":"type","size":"4"})
} # 定义字段类型,一般情况下模型的字段会自动转换成表单字段
field_classes = {
"name" : forms.CharField
} # 帮助提示信息
help_texts = {
"price" : "应该大于0"
} # 自定义错误信息
error_texts = {
# __all__ 设置全部错误信息
"__all__" :{
"required" : "请输入内容",
"invalid" : "请检查输入内容"
},
# 设置摸个字段的错误信息
"price" : {
"required" : "请输入价格",
"invalid" : "请检查数值是否正确"
}
} # 自定义表单字段weight的数据清洗
def clean_weight(self):
data = self.clean_data["weight"]
return data + "g"
  • 模型字段类型为ForeignKeyManyToManyField,在表单中对应的表单字段为ModelChoiceFieldModelMultipleChoiceField

  • 在自定义数据清洗函数时,必须以"clean_字段名"的格式作为函数名,而且函数必须有return返回值

def modelform_views(request,id):
if request.method == "GET":
instance = Product.objects.filter(id=id).first()
# 判断数据是否存在
if instance:
product = ProductModelForm(instance=instance)
else:
product = ProductModelForm(initial={"name":"mi","price":1999})
return render(request,'form.html',locals()) else:
product = ProductModelForm(request.POST)
if product.is_valid():
# 获取weight的数据,并通过clean_weight进行清洗
weight = product.cleaned_data["weight"] # # 数据保存方法一
# # 直接将数据保存到数据库
# product.save() # # 数据保存方法二
# # save方法设置commit=False,将生成数据库对象product_db,
# # 然后对该对象的属性值修改并保存
# product_db = product.save(commit=False)
# product_db.name = "new" + product_db.name
# product_db.save() # 数据保存方法三
# save_m2m()方法用于保存ManyToMany的数据模型
# product.save_m2m() return HttpResponse("提交成功!weight清洗后的数据为" + weight) else:
# 将错误信息输出,error_msg是将错误信息以json格式输出
error_msg = product.errors.as_json()
print('*'*20,error_msg)
return render(request,'form.html',locals())
  • 表单初始化4种方法

    • ProductModelForm(initial={'name':value}),适用于所有表单

    • ProductModelForm(instance=object),只适用于ModelForm

    • 定义表单时,可以对表单字段设置初始化参数initial,此方法不适用于ModelForm,如

      name=forms.CharField(initial=value)

    • 重写表单类的初始化函数__init__(),适用于所有表单类, 如在初始化函数__init__()中设置

      self.field['name'].inital=value

<玩转Django2.0>读书笔记:表单的更多相关文章

  1. <玩转Django2.0>读书笔记:模板和模型

    1. 模板内置标签 Django常用内置标签 标签 描述 {% for %} 遍历输出变量的内容 {% if %} 对变量进行条件判断 {% csrf_token %} 生成csrf_token标签, ...

  2. <玩转Django2.0>读书笔记:邮件和分页

    1. 发送邮件 # settings.py设置 # 邮箱设置 EMAIL_USE_SSL = True # 邮件服务器 EMAIL_HOST = 'smtp.qq.com' # 邮件服务端口 EMAI ...

  3. <玩转Django2.0>读书笔记:URL规则和视图

    1. 带变量的URL #urls.py from django.urls import path from .view import * urlpatterns = [ path('',index_v ...

  4. 【Django笔记四】Django2.0中的表单

    一.环境版本信息: 操作系统:windows10 Django版本:2.0.5 Python版本:3.6.4 Mysql版本: 5.5.53   安装mysql 二.基础信息 1.App中的模型mod ...

  5. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  6. 《玩转Django2.0》读书笔记-Django建站基础

    <玩转Django2.0>读书笔记-Django建站基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.网站的定义及组成 网站(Website)是指在因特网上根据一 ...

  7. 《玩转Django2.0》读书笔记-探究视图

    <玩转Django2.0>读书笔记-探究视图 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求 ...

  8. 《玩转Django2.0》读书笔记-编写URL规则

    <玩转Django2.0>读书笔记-编写URL规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. URL(Uniform Resource Locator,统一资源定位 ...

  9. 9. Javascript学习笔记——表单处理

    9. 表单处理 9.1 表单的基础知识 ///表单用 <form> 元素表示,对应的是 HTMLFormElement 类型,继承自 HTMLElement. //属性:action.me ...

随机推荐

  1. 【1】MySQL大数据量分页查询方法及其优化

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  2. 《11招玩转网络安全》之第四招:low级别的DVWA SQL注入

    以DVWA为例,进行手工注入,帮助读者了解注入原理和过程. 1.启动docker,并在终端中执行命令: docker ps -a docker start LocalDVWA docker ps 执行 ...

  3. LabView ModBus安装

    好久没写东西了(好菜哦...) 最近搞一个项目,开始入门LabVIEW,感觉类似于MATLAB里面的simulink 我使用LabVIEW是想用来和PLC通信的.因为PLC里面可以做ModBus,所以 ...

  4. robot framework

    一.步骤 1.创建工程和测试套件 2.创建测试案例 3.写脚本,运行案例 4.查看运行结果 report报告主要是概括性的报告,总结案例执行情况.log报告是更为详细的案例步骤的报告. 二.RIDE工 ...

  5. sql server 删除所有表和递归查询、数字类型转为字符串

    1.删除所有表 select 'drop table '+name+';' from sys.tables where name like 'DataSyncV1DelaySample%' or na ...

  6. Contest2178 - 2019-4-18 高一noip基础知识点 测试7 题解版

    刚刚改完题,才有时间发题解 传送门 T1 exgcd裸题 对a,b跑exgcd,答案就是x*c/gcd(a,b),y*c/gcd(a,b) 不合法的情况:当且仅当c%gcd(a,b)!=0 代码 T2 ...

  7. oracle insert into 插入多组数据方法总结

    网上好多oracle 的文章,多是以oracle开头,内容确实其他sql,一幅气死人不偿命的嘴脸着实让人难受. 今天就更新点oracle 使用insert into插入数据的方式: 1.oracle ...

  8. java 日常学习记录-反射

    Hero类 package helloworld; public class Hero { public String name; //姓名 public float hp; //血量 public ...

  9. 题解-GXOI/GZOI2019 特技飞行

    Problem loj3085 bzoj不放题面差评 题意概要:给出两条竖直直线,再给出 \(n\) 架飞机的初始航线:一条接通这两条直线的线段,保证航线交点不在两条直线上.现要求安排所有飞机在航线相 ...

  10. 题解 P4705 【玩游戏】

    这题是真的神仙啊...居然用的 stl 来卡常? 话说 998244353 真的可以一眼 NTT ? noteskey 所以说只要推柿子就好了但是有的地方的推导根本就想不到... 我们令第 t 个答案 ...