HTML表单

在HTML中,表单是在<form>...</form>中的一些元素,它允许访客做一些类似输入文本、选择选项、操作对象或空间等动作,然后将这些信息发送到服务器。
表单能够包含input元素,比如文本字段、复选框、单选框、提交按钮等等。

Django的Form类

Django表单的核心组件是Form类。它与Django模型描述对象的逻辑结构、行为以及它呈现给我们内容的形式的方式大致相同,Form类描述一张表单并决定它如何工作及呈现。
类似于模型类的字段映射到数据库字段的方式,表单类的字段会映射到HTML表单的<input>元素。ModelForm通过Form映射模型类的字段到HTML表单的<input>元素,Django admin就是基于此。
表单字段本身也是类,管理表单数据并提交时执行验证。
在浏览器中,表单字段HTML控件的形式展现给我们。每个字段类型都有与之相配的空间类,必要时也可以覆盖。

在Djanog编写一个简单的表单

forms.py

在需要的app目录下创建一个forms.py文件,然后编写Form类。

from django import forms


class NameForm(forms.Form):
    username = forms.CharField(label="username", max_length=20)

它定义了一个只包含usernaem的Form类,通过max_length来定义了字段最大长度。它会在HTML的<input>上添加一个maxlength="20",其次还会在服务器接收到表单传值时,对字段长度进行验证。
一个Form类的实例有一个is_valid()方法,他将用来判断表单是否通过验证验验证,如果通过的话将会返回Ture,然后可以是用实例对象的clean_data获取到需要的属性值。

views.py

Django网站对表单进行提交一后,需要由视图来进行处理。
views.py文件示例。

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import NameForm


def get_name(request):
    if request.method == "POST":
        form = NameForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect("/thanks/")
    else:  # 除POST以外的请求,返回一个空白表单
        form = NameForm()
    return render(request, "name.html", {"form": form})

如果我们访问这个视图使用的是GET请求,将会创建一个空白的表单实例,并将其放在模板上下文中进行渲染。
如果提交表单使用的是POST请求,那么视图将再次创建一个表单实例并使用请求中的诗句填充表单数据。form = NameForm(request.POST)这个叫绑定数据到表单。然后再调用表单的is_valid()方法,如果不为True,将带着表单返回到模板。如果is_valid()为True,就可以使用cleaned_data属性中找到所有通过验证的表单数据。

templates

name.html示例

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

所有的表单字段及其属性动将通过Django模板从{{ form }}中解包成HTML标记。
csrf_token:Django自带的跨站请求伪造保护,当通过POST方法提交一个启用了CSRF防护的表单时,必须在模板标签中使用csrf_token。

表单模板

表单渲染选项

{{ form.as_table }}将表单渲染成一个表格元素,每个输入框将作为一个<tr>标签。
{{ form.as_p }}将表单的每个输入框通过<p>标签进行包裹。
{{ form.as_ul }}将表单渲染成一个列表元素,每个输入框作为一个<li>标签。

手动渲染表单字段

可以通过{{ form.name_of_field }}获取每一个字段,然后分别进行渲染,label标签可以使用label_tag()方法来生成。

渲染表单错误信息

{{ form.name_of_field.errors }},将显示字段的错误信息列表,它将会被渲染成无序列表。
如果需要进一步定制这个样式,可以循环错误信息列表中的内容,然后进行单独设计样式:

{% if form.subject.errors %}
    <ol>
    {% for error in form.subject.errors %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}

一起非字段错误信息,比如表单的错误,隐藏字段的错误都保存在{{ form.non_field_errors }}中。

循环表单的字段

如果表单字段有相同格式的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 }} 字段对相应的label信息
{{ field.label_tag }} 自动生成的label标签
{{ field.id_for_label }} 自定义字段标签的id
{{ field.value }} 当前字段的值
{{ field.html_name }} 指定字段生成的input标签中name属性的值
{{ field.help_text }} 字段的帮助信息
{{ field.errors }} 包含错误信息的元素
{{ field.is_hidden }} 用于判断当前字段是否为隐藏的字段
{{ field.field }} 返回字段的参数列表

不可见字段处理

很多时候,表单中会有一些隐藏的不可见字段。需要让它在任何时候都仿佛不存在一样,比如有错误的时候,如果在页面上显示了不可见字段的错误信息,那么用户会很疑惑它是从哪来的,所以,通常是不显示不可见字段的错误信息。
Django提供了两种独立的方式,用于循环不可见和课件的字段,hidden_fields()visible_fields()

重用表单模板

如果在HTML文件中,多次使用同一种表单模板,那么完全可以把表单模板存成一个单独的HTML文件,然后在别的HTML文件中通过include模板语法将其包含进来。

# 实际页面文件
{% include "form_snippet.html" %}


# 单独表单模板文件 form_snippet.html
{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}

如果页面引用了好几个不同的表单模板,为了防止冲突,可以使用with参数,给每个表单模板取个别名。

{% include "form_snippet.html" with form=comment_form %}

# 循环时使用
{% for field in comment_form %}
    ...
{% endfor %}
0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

Django-rest-framework教程

django-rest-framework教程。

Django 2019-07-18 16:33:26

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34