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. 安卓ADB学习笔记

    ADB(Android Debug Bridge)可以远程调试安卓设备,包括模拟器,可以进入终端模式(安卓本身相当于一个linux) 1.配置adb环境变量 以夜神模拟器为例,将模拟器安装路径里的bi ...

  2. luogu 2157 状压dp

    f[i][j][k]分别代表1-i-1个人全部打完饭时i及其后7个人的状态为j时最后一个打饭的人为i+k的状态下所用的最小时间 当i已经打过饭时 即 j&1 那么 f [i] [j>&g ...

  3. 论文阅读笔记(二)U-Net

    U-Net: Convolutional Networks for Biomedical Image Segmentation U-Net:用于生物医学图像分割的卷积网络 摘要 要想成功地训练一个深度 ...

  4. 分布式系列十三: nginx

    nginx偏运维, 不过作为开发应该了解它能做什么事情, 其作为技术架构的一部分必不可少 正向代理和反向代理 正向代理是代理的客户端, 反向代理是代理的服务端. nginx就是一款可以作反向代理的we ...

  5. iview 非 template/render 标签转换

    在 非 template/render情形下使用 iview,发现除了官方的一些需要注意的点外,还有一些其他需要注意的,这里记录下,防踩坑: 官方说明: 在非 template/render 模式下( ...

  6. 【转】一文掌握 Linux 性能分析之网络篇(续)

    [转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...

  7. *42. Trapping Rain Water 接雨水

    1. 原始题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这 ...

  8. Timeline高级扩展

    转载于http://forum.china.unity3d.com/thread-32200-1-1.html通过demo讲解了timeline更加复杂的使用方式 Timeline是创建过场动画和影片 ...

  9. python 字符串转化为json、post请求

    在json模块有2个方法, loads():将json数据转化成dict数据 dumps():将dict数据转化成json数据 load():读取json文件数据,转成dict数据 dump():将d ...

  10. css制作小标志

    空心箭头:示例图片 <b class="bottom"><i class="bottom-arrow1"></i><i ...