Django form,django forms

  Django form,django forms

  知识预览

  构建表单在Django中构建表单Django表单类的详细解释使用表单模板返回顶部

  构建表单假设您想在网站上创建一个简单的表单来获取用户的姓名。您需要一个这样的模板:

  form action=/your-name/ method= post

  您的姓名的标签:/label

  输入id=您的姓名 type=text name=您的姓名

  输入类型=提交值=确定

  /表单

  这是一个非常简单的表格。在实践中,一个表单可能包含几十个或几百个字段,其中大部分需要预填充,我们预计用户将多次编辑-提交来完成操作。

  在提交表单之前,我们可能需要在浏览器端进行一些验证。我们可能希望使用非常复杂的字段来允许用户从日历中选择日期等等。

  这时候Django就很容易替我们做大部分工作了。

  所以,两个突出的优点:

  1提交表单时,数据出现错误,返回的页面中仍可保留之前输入的数据。

  2容易限制现场条件。

  回到顶端

  在Django中构建一个表单类。我们已经计划好了HTML表单的外观。在姜戈,我们的起点在这里:

  #forms.py

  从django进口表格

  类名表单(表单。表单):

  your_name=表单。CharField(label=你的名字,max_length=100)

  它定义了一个只有一个字段(your_name)的表单类。

  字段的最大允许长度由max_length定义。它完成了两件事。首先,它在HTML的输入上放置一个maxlength=100 (这样浏览器首先会阻止用户输入超过这个数量的字符)。这也意味着当Django收到浏览器发送的表单时,它将验证数据的长度。

  Form的实例有一个is_valid()方法,它为所有字段运行验证程序。调用此方法时,如果所有字段都包含合法数据,它将:

  如果为True,则将表单数据放入cleaned_data属性中。第一次呈现时,完整的表单将如下所示:

  您的姓名的标签:/label

  输入id=您的姓名 type=text name=您的姓名 maxlength=100

  注意,它不包含表单标签和提交按钮。我们必须自己在模板中提供它们。

  视图发送到Django网站的表单数据是由一个视图处理的,该视图通常与发布该表单的视图相同。这允许我们重用一些相同的逻辑。

  当处理表单时,我们需要在视图中实例化它:

  #views.py

  从django.shortcuts导入渲染

  从django.http导入HttpResponseRedirect

  从。表单导入名称表单

  def get_name(请求):

  #如果这是一个POST请求,我们需要处理表单数据

  if request.method==POST :

  #创建一个表单实例并用请求中的数据填充它:

  form=NameForm(请求。帖子)

  #检查它是否有效:

  if form.is_valid():

  #根据需要处理form.cleaned_data中的数据

  # .

  #重定向到新的URL:

  返回HttpResponseRedirect(/thanks/)

  #如果一个GET(或任何其他方法)我们将创建一个空白表单

  否则:

  form=NameForm()

  返回render(request, name.html ,{form: form})

  如果对视图的访问是一个GET请求,它将创建一个空的表单实例,并将其放在要呈现的模板的上下文中。这是我们第一次访问该URL时预期会发生的情况。

  如果表单的提交使用POST请求,那么视图将再次创建一个表单实例,并用来自请求的数据填充它:form=NameForm(request。贴)。这称为“将数据绑定到表单”(现在是绑定表单)。

  我们调用表单的is_valid()方法;如果不正确,我们将使用此表单返回模板。此时,表单不再是空的(未绑定),因此HTML表单将填充以前提交的数据,然后可以根据需要进行编辑和更正。

  如果is_valid()为True,我们将能够在cleaned_data属性中找到所有有效的表单数据。在向浏览器发送HTTP重定向以告诉它下一步去哪里之前,我们可以使用这些数据来更新数据库或进行其他处理。

  模板我们不需要在name.html模板做很多工作。最简单的例子是:

  form action=/your-name/ method= post

  {% csrf_token %}

  {{ form }}

  输入类型=提交值=提交/

  /表单

  根据{{ form }},所有的表单域及其属性都将通过Django的模板语言拆分成HTML标签。

  注意:Django本身支持简单易用的跨站点请求伪造保护。当提交启用了CSRF保护的POST表单时,必须使用上面示例中的csrf_token模板标记。

  现在我们有了一个工作的web表单,它由Django Form描述,由view处理并呈现为HTML表单。

  回到顶端

  对于Django表单类来说,详细解释绑定表单和未绑定表单之间的区别是很重要的:

  未绑定窗体没有关联的数据。当呈现给用户时,它将为空或包含默认值。的绑定表单已经提交了数据,所以可以用它来检查数据是否合法。如果呈现非法的绑定表单,它将包含一条内联错误消息,告诉用户如何更正数据。字段的详细说明考虑一个比上面的小例子更有用的表单,我们完成一个更有用的注册表单:

  #forms.py

  从django进口表格

  类注册表表单(表单。表单):

  用户名=表单。CharField(max_length=100,

  Error_messages={min_length :最少5个字符,必需:此字段不能为空 },

  )

  密码=表单。CharField(max_length=100,

  小部件=小部件。password input(attrs={ placeholder : password })

  )

  电话=表格。IntegerField(

  错误消息={

  无效的“:”格式错误

  }

  )

  性别=形式。夏菲尔德(

  初始=2,

  widget=widgets . select(choices=((1,上海),(2,北京)))

  )

  电子邮件=表单。电子邮件字段()

  is _已婚=形式。BooleanField(必填=False)

  Widgets每个表单域都有一个对应的Widget类,对应一个HTML表单Widget,比如input type=text 。

  在大多数情况下,一个字段有一个合理的默认小部件。例如,默认情况下,CharField有一个TextInput小部件,它在HTML中生成一个输入type=text。

  无论表单提交的是什么数据,一旦通过调用is_valid () (is_valid()返回True)验证成功,验证后的表单数据将位于form.cleaned_data字典中。这些数据已经为您转换成Python类型。

  注意:此时,您仍然可以直接从请求中访问未验证的数据。POST,但最好是访问验证过的数据。

  在上面的联系人表单示例中,is_married将是一个布尔值。类似地,IntegerField和FloatField字段分别将值转换为Python的int和float。

  回到顶端

  要使用表单模板,您只需将表单实例放在模板的上下文中。如果您的表单在Contex t中被称为form,那么{{ form }}将正确呈现其标签和输入元素。

  呈现标签/输入对表单的选项,有几个输出选项:

  {{ form.as_table }}以表格的形式将它们渲染在tr标签中{{ form.as_p }}将它们渲染在p标签中{{ form.as_ul }}将它们渲染在李标签中注意,你必须自己提供桌子或保险商实验所元素。

  {{ form.as_p }}会渲染如下:

  表单操作=

  p

  = id _用户名用户名的标签:/标签

  输入id= id _ username maxlength= 100 name= username type= text required=

  /p

  p

  =id_password 密码的标签:/标签

  输入id= id _ password maxlength= 100 name= password placeholder= password type= password required=

  /p

  p

  = id _电话电话的标签:/label input id= id _ Telephone name= Telephone type= number required=

  /p

  p

  的标签=id_email 电子邮件:/label input id= id _ Email name= Email type= Email required=

  /p

  p

  = id _ is _已婚的标签为已婚:/label input id= id _ Is _ married name= Is _ married type= checkbox

  /p

  输入类型=提交值=注册

  /表单

  手工渲染字段我们没有必要非要让姜戈来分拆表单的字段;如果我们喜欢,我们可以手工来做(例如,这样允许重新对字段排序)。每个字段都是表单的一个属性,可以使用{{ form.name_of_field }}访问,并将在姜戈模板中正确地渲染。例如:

  差异

  {{表单。用户名。错误}}

  {{表单。用户名。标签_标签}}

  {{表单。用户名}}

  /div

  渲染表单的错误信息1、

  registerForm=RegisterForm(请求。帖子)

  打印(类型(登记表。错误))# class django。表格。utils。“错误字典”

  打印(类型(登记表。错误[ username ])# class django。表格。utils。错误列表

  2、

  使用{{ form.name_of_field.errors }}显示表单错误的一个清单,并渲染成一个ul。看上去可能像:

  保险商实验所

  里发件人是必填项。/李

  /ul

  形式组件的钩子

  定义foo(请求):

  if request.method==POST :

  regForm=RegForm(请求。帖子)

  if regForm.is_valid():

  及格

  # 可用数据:regForm.cleaned_data,

  # 将数据插入数据库表中

  否则:

  及格

  # 可用数据:regForm.errors

  # 可以利用模板渲染讲错误嵌套到页面中返回

  # 也可以打包到一个字典中,用于创建交互式、快速动态网页应用的网页开发技术返回

  否则:

  regForm=RegForm()

  return render(请求, register.html ,{regForm:regForm})

  实例化时:

  self.fields={

  用户名":"字段规则对象,

  密码":"字段规则对象,

  }

  是否有效时:

  自我. errors={}

  self.cleaned_data={}

  #局部钩子:

  对于名称,self.fields.items()中的字段:

  尝试:

  value=field.clean(值)

  self.cleaned_data[name]=value

  if hasattr(self, clean_%s % name):

  value=getattr(self, clean_%s % name)()

  self.cleaned_data[name]=value

  除了验证错误为e:

  self.add_error(名称,e)

  # 全局钩子:

  self.clean() # def self.clean():返回自我清理_数据

  返回不是自我错误#真或者错误的

  形式组件补充1、姜戈内置字段如下:

  田

  必需=真,是否允许为空

  小部件=无,HTML插件

  标签=无,用于生成标签标签或显示内容

  初始=无,初始值

  help_text= ,帮助信息(在标签旁边显示)

  错误消息=无,错误信息{ 必需: 不能为空,无效: 格式错误}

  show_hidden_initial=False,是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)

  验证器=[],自定义验证规则

  localize=False,是否支持本地化

  禁用=假,是否可以编辑

  标签后缀=无标签内容后缀

  夏菲尔德(字段)

  max _ length=无,最大长度

  最小长度=无,最小长度

  strip=True是否移除用户输入空白

  整数字段(字段)

  最大值=无,最大值

  最小值=无,最小值

  浮点字段(整数字段)

  .

  十进制字段

  最大值=无,最大值

  最小值=无,最小值

  max _ digits=无,总长度

  小数位数=无,小数位长度

  基本时间字段(字段)

  输入格式=无时间格式化

  日期字段(基础时间字段)格式:2015-09-01

  时间字段(基本时间字段)格式:11:12

  日期时间字段(基础时间字段)格式:2015-09-01 11:12

  工期域(域)时间间隔:%d %H:%M:%S,%f

  .

  正则表达式字段(字符字段)

  正则表达式,自定制正则表达式

  max _ length=无,最大长度

  最小长度=无,最小长度

  错误消息=无,忽略,错误信息使用error_messages={invalid : . }

  电子邮件字段(字符字段)

  .

  文件字段(字段)

  允许_空_文件=假是否允许空文件

  图像字段(文件字段)

  .

  注:需要太平航运模块,pip3安装枕头

  以上两个字典使用时,需要注意两点:

  表示"具有…形状的”:十字形表单中enctype=multipart/form-data

  -查看函数中obj=MyForm(请求。发帖,请求。文件)

  URLField(字段)

  .

  布尔字段(字段)

  .

  NullBooleanField(BooleanField)

  .

  选择字段(字段)

  .

  choices=(),选项,如:choices=((0,上海),(1,北京),)

  必需=真,是否必填

  小部件=无,插件,默认挑选插件

  标签=无,标签内容

  初始=无,初始值

  help_text= ,帮助提示

  模型选择字段(选择字段)

  .姜戈。表格。模特。模型选择字段

  查询设置,#查询数据库中的数据

  empty_label= -,#默认空显示内容

  to_field_name=None,# HTML中价值的值对应的字段

  limit _ choices _ to=无#模型表单中对查询二次筛选

  模型多重选择字段(模型选择字段)

  .姜戈。表格。模特。modellechoicefield

  类型选择字段(选择字段)

  强制=val:val对选中的值进行一次转换

  empty_value= 空值的默认值

  多重选择字段(选择字段)

  .

  TypedMultipleChoiceField(多选择字段)

  强制=val:val对选中的每一个值进行一次转换

  empty_value= 空值的默认值

  组合字段(字段)

  字段=()使用多个验证,如下:即验证最大长度20,又验证邮箱格式

  字段ComboField(fields=[fields .CharField(max_length=20),字段EmailField(),])

  多值字段

  PS:抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合多小部件使用

  SplitDateTimeField(多值字段)

  输入日期格式=无,格式列表:[%Y - %m - %d , %m%d/%Y , %m/%d/%y]

  输入时间格式=无格式列表:[%H:%M:%S , %H:%M:%S.%f , %H:%M]

  文件路径字段(选择字段)文件选项,目录下文件显示在页面中

  路径,文件夹路径

  匹配=无,正则匹配

  递归=假,递归下面的文件夹

  allow_files=True,允许文件

  allow_folders=False允许文件夹

  必需=真,

  小部件=无,

  标签=无,

  初始=无,

  help_text=

  GenericIPAddressField

  协议=both ,both,ipv4,ipv6支持的互联网协议(互联网协议)格式

  unpack_ipv4=False解析ipv4地址,如果是法国法郎:192.0.2.1时候,可解析为192.0.2.1,附言:礼仪必须为两者才能启用

  斯拉格菲尔德数字,字母,下划线,减号(连字符)

  .

  UUIDField(CharField) uuid类型

  .查看代码

  2、姜戈内置插件:

  文本输入(输入)

  数字输入(文本输入)

  电子邮件输入(文本输入)

  URLInput(文本输入)

  密码输入(文本输入)

  隐藏输入(文本输入)

  文本区域(小部件)

  日期输入(日期时间基础输入)

  日期时间输入

  时间输入(日期时间基础输入)

  复选框输入

  挑选

  NullBooleanSelect

  选择多个

  无线电选择

  复选框选择多个

  文件输入

  ClearableFileInput

  多重隐藏输入

  SplitDateTimeWidget

  SplitHiddenDateTimeWidget

  选择日期视图代码

  3、常用选择插件:

  # 单收音机,值为字符串

  #用户=字段。夏菲尔德(

  # initial=2,

  # widget=widgets .RadioSelect(choices=((1,上海),(2,北京),))

  # )

  # 单收音机,值为字符串

  #用户=字段。选择字段(

  # choices=((1,上海), (2, 北京),),

  # initial=2,

  # widget=widgets .无线电选择

  # )

  # 单选择,值为字符串

  #用户=字段。夏菲尔德(

  # initial=2,

  # widget=widgets .Select(choices=((1,上海),(2,北京),))

  # )

  # 单选择,值为字符串

  #用户=字段。选择字段(

  # choices=((1,上海), (2, 北京),),

  # initial=2,

  # widget=widgets .挑选

  # )

  # 多选选择,值为列表

  #用户=字段。多重选择字段(

  # choices=((1,上海),(2,北京),),

  # initial=[1,],

  # widget=widgets .选择多个

  # )

  # 单检验盒

  #用户=字段。夏菲尔德(

  # widget=widgets .复选框输入()

  # )

  # 多选复选框,值为列表

  #用户=字段。多重选择字段(

  # initial=[2,],

  # choices=((1,上海), (2, 北京),),

  # widget=widgets .复选框选择多个

  #)查看代码

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: