这一篇教程,我们继续了解Django的表单。
在上一篇教程中,我们了解了Django表单的基本使用过程。
接下来,我们继续深入了解Django表单的其他功能,以及更多底层的内容。
一、使用更多的字段
我们可以在定义表单类时使用多个字段。
不过要注意,如果表单类中包含URLField、EmailField或任何整数类型的字段,Django会使用HTML5的输入框类型。
默认情况下,浏览器会自动进行这些字段的验证,甚至比Django的验证更加严格。
如果要禁用浏览器的自动验证,需要在<form>标签上设置novalidate属性值为“novalidate”,整个表单将会禁用验证功能。
示例代码:
<form action="/email/" method="post" novalidate="novalidate">
如果只想取消某个字段的验证,可以为字段指定为其他标签,比如“TextInput”。
示例代码:
email = forms.EmailField(label='邮箱', widget=forms.TextInput)
接下来,我们来创建一个带有多个字段的表单类。
例如,一个发送邮件的表单,会包含标题、消息内容、发件人以及是否抄送给自己等等。
示例代码:
class ContactForm(forms.Form): subject = forms.CharField(label='主题', label_suffix=':', widget=forms.TextInput(attrs={'style': 'width:440px', 'maxlength': '100'})) # 定义标题字段,指定文本框宽度并限定字符数量。 message = forms.CharField(label='消息', label_suffix=':', widget=forms.Textarea(attrs={'cols': '60', 'rows': '10'})) # 定义消息字段,指定使用文本域(多行文本框)标签,并设置标签的属性。 sender = forms.EmailField(label='发送人', help_text='请输入正确的邮箱地址!', label_suffix=':') # 定义发件人字段,指定为邮箱地址类型的字段。 cc_myself = forms.BooleanField(label='是否抄送自己', label_suffix=':', required=False) # 定义抄送字段,指定为布尔类型(真假值)的字段。
在上方代码中,我们能够看到两个“CharField”类型的字段。
不同的是,第一个“CharField”类型的字段“subject”在网页上产生的HTML代码如下所示。
示例代码:
<label for="id_subject">主题:</label> <input type="text" name="subject" style="width:440px" maxlength="100" required id="id_subject" />
而第二个“CharField”类型的字段“subject”在网页上产生的HTML代码则会是另外一个<textarea>标签。
示例代码:
<label for="id_message">消息:</label> <textarea name="message" cols="60" rows="10" required id="id_message"></textarea>
另外,在代码中我们看到了一些部件(widget)的参数。
其中,“attrs”参数是以字典的形式设置HTML标签的属性。
而“label_suffix”参数,是指<label>标签上文字后缀,默认是英文半角的“:”,如果想改成其他则需要设置这个参数的值,例如,这里改成了中文的“:”。
最后,大家应该也看到了“EmailField”带有一个“help_text”参数,这是表单元素后方的文本提示信息。
二、表单数据整合到模板的多种方式
我们在视图文件“views.py”中实例化上方新建等等表单,并通过视图函数将它和模板进行整合。
示例代码:
from .forms import ContactForm def write_email(request): form = ContactForm() return render(request, 'email.html', {'form':form})
我们在视图函数中将表单对象传递给“email.html”这个模板。
在“email”这个模板中,我们需要对表单对象进行处理。
如果只是通过“{{ form }}”的方式将表单添加到模板的话,所有的表单元素会平铺在页面中,达不到我们的要求。
所以,我们需要进行一些处理。
1、使用表单输出选项
Django给我们提供的表单输出选项有3种:
{{ form.as_table }}:以表格形式加载表单元素 {{ form.as_p }}:以段落形式加载表单元素 {{ form.as_ul }:以列表形式加载表单元素以段落形式为例。
示例代码:
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>撰写邮件</title> </head> <body> <form action="/send_email/" method="post"> <strong> {{ form.as_p }}</strong> <input type="submit" value="发送"> </form> </body> </html>
采用这种形式,最终所呈现的页面,源代码中包含如下内容。
示例代码(页面部分源代码):
<p><label for="id_subject">主题:</label> <input type="text" name="subject" style="width:440px" maxlength="100" required id="id_subject" /></p> <p><label for="id_message">消息:</label> <textarea name="message" cols="60" rows="10" required id="id_message"> </textarea></p> <p><label for="id_sender">发送人:</label> <input type="email" name="sender" required id="id_sender" /> <span class="helptext">请输入正确的邮箱地址!</span></p> <p><label for="id_cc_myself">是否抄送自己:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
显然,采用段落这种输出形式时,Django自动将每个表单元素添加到了一对<p>标签中,表格和列表也类似于这种处理方式。
2、自定义输出表单元素
Django给我们提供的输出选项,在很多时候并不能满足我们的要求。
所以,我们可以自己定义表单的加载。
之前已经提到过,通过模板标记“{{ form.字段名称 }}”可以获取表单元素。
那么,之前的表单内容,我们就可以通过这种模板标记来完成自定义输出。
示例代码:
<form action="/send_email/" method="post"> <strong> <label for="{{ form.subject.id_for_label }}">标题:</label></strong> <strong> {{ form.subject }}</strong> <strong> <input type="submit" value="发送"></strong> </form>
采用这种形式,最终所呈现的页面,源代码中包含如下内容。
示例代码(页面部分源代码):
<label for="id_subject">标题:</label> <input type="text" name="subject" style="width:440px" maxlength="100" required id="id_subject" />
每一个表单对象中的字段,我们都可以进行这样的处理,以满足我们的一些个性化需求(例如通过“class”属性指定元素的样式)。
查看更多关于Django2:Web项目开发入门笔记(18)的详细内容...