在大多数情况下,该字段将具有明智的默认小部件。例如,默认情况下,a CharField将具有在HTML TextInput中生成a的小部件。如果需要 ,可以在定义表单字段时指定适当的小部件,就像我们对字段所做的那样。<input type="text"><textarea>message
现场数据
无论通过表单提交的数据是什么,一旦通过调用成功验证is_valid()(并is_valid()返回True),经过验证的表单数据都将位于form.cleaned_data字典中。这些数据将为您很好地转换为Python类型。
注意
此时,您仍然可以直接访问未经验证的数据request.POST,但是经过验证的数据更好。
在上面的联系表单示例中,cc_myself将为布尔值。同样,诸如IntegerField和FloatField将值分别转换为Python int和的字段float。
以下是在处理此表单的视图中如何处理表单数据的方法:
的views.pyfrom django.core.mail import send_mail if form.is_valid(): subject = form.cleaned_data['subject'] message = form.cleaned_data['message'] sender = form.cleaned_data['sender'] cc_myself = form.cleaned_data['cc_myself'] recipients = ['info@example.com'] if cc_myself: recipients.append(sender) send_mail(subject, message, sender, recipients) return HttpResponseRedirect('/thanks/')
小费
有关从Django发送电子邮件的更多信息,请参见发送电子邮件。
一些字段类型需要一些额外的处理。例如,使用表单上传的文件需要进行不同的处理(可以从而request.FILES不是从中检索它们 request.POST)。有关如何处理表单上载文件的详细信息,请参阅将上载的文件绑定到表单。
与表单模板工作
将表单放入模板所需要做的就是将表单实例放入模板上下文中。因此,如果您的表单是form在上下文中调用的,则将适当地呈现其和元素。{{ form }}<label><input>
形成渲染选项
附加表格模板家具
不要忘了,一个形式的输出并没有包括周围的 <form>标签,或窗体的submit控制。您必须自己提供这些。
<label>/ <input>对还有其他输出选项:
- {{ form.as_table }}将它们呈现为包装在<tr> 标签中的表格单元格
- {{ form.as_p }}将它们包裹在<p>标签中
- {{ form.as_ul }}将它们包裹在<li>标签中
请注意,您必须自己提供周围环境<table>或<ul> 元素。
这是我们的实例的输出:{{ form.as_p }}ContactForm
<p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" required></p> <p><label for="id_message">Message:</label> <textarea name="message" id="id_message" required></textarea></p> <p><label for="id_sender">Sender:</label> <input type="email" name="sender" id="id_sender" required></p> <p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself"></p>
请注意,每个表单字段的ID属性设置为id_<field-name>,由随附的标签标记引用。这对于确保辅助技术(例如屏幕阅读器软件)可访问表单很重要。您还可以自定义标签和ID的生成方式。
有关更多信息,请参见将表单输出为HTML。
手动渲染领域
我们不必让Django解压缩表单字段;我们可以根据需要手动进行操作(例如,允许我们对字段进行重新排序)。每个字段都可以使用用作表单的属性,并且在Django模板中将适当地呈现。例如:{{ form.name_of_field }}
{{ form.non_field_errors }} <div class="fieldWrapper"> {{ form.subject.errors }} <label for="{{ form.subject.id_for_label }}">Email subject:</label> {{ form.subject }} </div> <div class="fieldWrapper"> {{ form.message.errors }} <label for="{{ form.message.id_for_label }}">Your message:</label> {{ form.message }} </div> <div class="fieldWrapper"> {{ form.sender.errors }} <label for="{{ form.sender.id_for_label }}">Your email address:</label> {{ form.sender }} </div> <div class="fieldWrapper"> {{ form.cc_myself.errors }} <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label> {{ form.cc_myself }} </div>
<label>也可以使用生成完整的元素 label_tag()。例如:
<div class="fieldWrapper"> {{ form.subject.errors }} {{ form.subject.label_tag }} {{ form.subject }} </div>
呈现形式的错误消息
当然,这种灵活性的代价是更多的工作。到目前为止,我们不必担心如何显示表单错误,因为这已经为我们解决了。在此示例中,我们必须确保处理每个字段的所有错误以及整个表单的所有错误。请注意在表单和模板查找的顶部,以查找每个字段上的错误。{{ form.non_field_errors }}
使用显示格式错误列表,并显示为无序列表。可能看起来像:{{ form.name_of_field.errors }}
<ul class="errorlist"> <li>Sender is required.</li> </ul>
该列表的CSS类errorlist允许您设置外观样式。如果您希望进一步自定义错误的显示,可以通过遍历它们来实现:
{% if form.subject.errors %} <ol> {% for error in form.subject.errors %} <li><strong>{{ error|escape }}</strong></li> {% endfor %} </ol> {% endif %}
非字段错误(和/或使用诸如的辅助工具时在表单顶部显示的隐藏字段错误form.as_p())将通过附加的类别呈现,nonfield以帮助将其与特定于字段的错误区分开。例如,如下所示:{{ form.non_field_errors }}
<ul class="errorlist nonfield"> <li>Generic validation error</li> </ul>
有关错误,样式以及如何在模板中使用表单属性的更多信息,请参见Forms API。
遍历表单的字段
如果您对每个表单字段使用相同的HTML,则可以通过使用 循环依次遍历每个字段来减少重复代码:{% for %}
{% for field in form %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} {% if field.help_text %} <p class="help">{{ field.help_text|safe }}</p> {% endif %} </div> {% endfor %}
有用的属性包括:{{ field }}
{{ field.label }}
- 字段的标签,例如。
Email address
{{ field.label_tag }}
字段的标签包装在适当的HTML
<label>
标记中。这包括表格的label_suffix
。例如,默认label_suffix
值为冒号:<label for="id_email">Email address:</label>
{{ field.id_for_label }}
- 将用于此字段的ID(
id_email
在上面的示例中)。如果您是手动构建标签,则可能要使用它代替label_tag
。例如,如果您有一些内联JavaScript并希望避免对字段ID进行硬编码,它也很有用。{{ field.value }}
- 字段的值。例如
someone@example.com
。{{ field.html_name }}
- 输入元素的名称字段中将使用的字段名称。如果已设置,则将格式前缀考虑在内。
{{ field.help_text }}
- 与该字段关联的任何帮助文本。
{{ field.errors }}
- 输出一个,其中包含与此字段对应的任何验证错误。您可以使用循环自定义错误的表示形式。在这种情况下,循环中的每个对象都是一个包含错误消息的字符串。
<ul class="errorlist">
{% for error in field.errors %}
{{ field.is_hidden }}
- 此属性是
True
表单字段是否为隐藏字段,False
否则为隐藏字段 。它作为模板变量不是特别有用,但在条件测试中可能有用,例如:{% if field.is_hidden %} {# Do something special #} {% endif %}
{{ field.field }}
- 包装
Field
的表单类中的实例BoundField
。您可以使用它来访问Field
属性,例如 。{{ char_field.field.max_length }}
也可以看看
有关属性和方法的完整列表,请参见 BoundField。
遍历隐藏和可见字段
如果您要手动在模板中布置表单,而不是依赖Django的默认表单布局,则可能需要将 字段与非隐藏字段区别对待。例如,由于隐藏字段不显示任何内容,因此将错误消息放在该字段旁边可能会给您的用户造成混乱-因此,应对这些字段的错误进行不同的处理。<input type="hidden">
Django在表单上提供了两种方法,可让您独立遍历隐藏字段和可见字段:hidden_fields()和 visible_fields()。这是对使用这两种方法的先前示例的修改:
{# Include the hidden fields #} {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} {# Include the visible fields #} {% for field in form.visible_fields %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} </div> {% endfor %}
本示例不处理隐藏字段中的任何错误。通常,隐藏字段中的错误是表单被篡改的标志,因为正常的表单交互不会改变它们。但是,您也可以轻松地为这些表单错误插入一些错误显示。
可重复使用的表单模板
如果您的站点在多个位置对表单使用相同的呈现逻辑,则可以通过将表单的循环保存在独立模板中并使用include标签在其他模板中重用它来减少重复:
# In your form template: {% include "form_snippet.html" %} # In form_snippet.html: {% for field in form %} <div class="fieldWrapper"> {{ field.errors }} {{ field.label_tag }} {{ field }} </div> {% endfor %}
如果传递给模板的表单对象在上下文中具有不同的名称,则可以使用 标记的with参数对其进行别名include:
{% include "form_snippet.html" with form=comment_form %}
如果您发现自己经常这样做,则可以考虑创建一个自定义 包含标签。
详情参考: https://docs.djangoproject.com/en/3.0/topics/forms/#working-with-form-templates
标签:Django
相关阅读 >>
更多相关阅读请进入《Django》频道 >>
书籍 Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。
相关推荐
评论
管理员已关闭评论功能...
- 欢迎访问木庄网络博客
- 可复制:代码框内的文字。
- 方法:Ctrl+C。