Django 中的表单
在jango中的表单与平常意义的表单在理解上有所不同.我们先来说说常见的表单
HTML forms:
在HTML中一个表单就是一个集合,集合的内容是<form></form>里的元素,像文本框,单选框,操控按钮等,让用户操作,使才用户录入的信息返回服务器。但是这里面用html创建出的元素功能过于简单。例如<input></input>提供用户输入,但是在我们不对其做限制的时候(js实现)用户的输入是不受限制的,或是说合法性我们只能在数据返回到服务器的时候做逻辑判断再把判断结果发回给用户。
Django的表单:
django中的表单形式可以实现复杂的业务处理。html中的表单是把前端数据直接返回服务器,但是在jango中实现表单数据采集一共分3步:1.为前端渲染准备数据结构的定义(string or int ?)在第一步里我们可以细致化的设置每一个input框输入内容的格式例如:邮箱.可以限制输入内容的长度。2.在前端html渲染后台定义好的数据结构在这一步渲染后的form里的各个元素会根据先前设置实现自动判断用户输入是否满足条件,例如:邮箱的格式是否正确 3.接受表单提交数据到服务器直至每个元素的输入都合法后才可以触发表单提交动作,与html中表单提交类似
这里我们直接来看下Django中的表单使用例子
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label=’Your name’, max_length=100)
这个表单类只有一个字段(your_name),我们采用人性化的标签字段,这
将出现在<label>当它呈现时,我们限制该输入框最多允许长度为100的字符串
我们在views中写这么一段代码
from django.shortcuts import render
from django.http import HttpResponseRedirect
def get_name(request):
# 如果是POST请求
if request.method == ’POST’:
#通过接收到的数据创建表单实例
form = NameForm(request.POST)
# 检查它是不是合法
if form.is_valid():
return HttpResponseRedirect(’/thanks/’)
else:
form = NameForm()
return render(request, ’name.html’, {’form’: form})
—- >在html页面中写 >
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
这里我们在views中写下这段代码,如果用户第一次进入表单所在的页面,form为NameForm()
这时候前端html会渲染出后台定义好的form的每一个元素
当然jango的Form也提供了表单前端渲染时候的几个选项
form.as_table 在<tr>中渲染
form.as_p 在<p>中渲染
form.as_ul 在<li>中渲染
这里还可以更细致的控制前端渲染
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.subject.errors }}
<label for="id_subject">Email subject:</label>
{{ form.subject }}
</div>
<div class="fieldWrapper">
{{ form.message.errors }}
<label for="id_message">Your message:</label>
{{ form.message }}
</div>
<div class="fieldWrapper">
{{ form.sender.errors }}
<label for="id_sender">Your email address:</label>
{{ form.sender }}
</div>
<div class="fieldWrapper">
{{ form.cc_myself.errors }}
{{ form.cc_myself }}
</div>
objects.errors表示该标签在录入中如果格式错误,报错信息的位置
{{ field.label }} 表示字段的label
{{ field.label_tag }} 表示该字段的label在一个<label>标签内
{{ field.value }} 表示用户输入的值
{{ field.label }} :表示字段的label