django form 组件

普通HTML表单

例如,Django Admin 站点的登录表单包含几个<input> 元素:type="text" 用于用户名,type="password" 用于密码,type="submit" 用于“Log in" 按钮。它还包含一些用户看不到的隐藏的文本字段,Django 使用它们来决定下一步的行为。
它还告诉浏览器表单数据应该发往<form> 的action 属性指定的URL —— /admin/,而且应该使用method 属性指定的HTTP 方法 —— post。
当触发<input type="submit" value="Log in"> 元素时,数据将发送给/admin/。

GET & POST

处理表单时候只会用到GET 和 POST 方法。
Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据、对它们进行编码以用于传输、将它们发送到服务器然后接收它的响应。
相反,GET 组合提交的数据为一个字符串,然后使用它来生成一个URL。这个URL 将包含数据发送的地址以及数据的键和值。如果你在Django 文档中做一次搜索,你会立即看到这点,此时将生成一个https://docs.djangoproject.com/search/?q=forms&release=1 形式的URL。
GET 和POST 用于不同的目的。
用于改变系统状态的请求 —— 例如,给数据库带来变化的请求 —— 应该使用POST。GET 只应该用于不会影响系统状态的请求。
GET 还不适合密码表单,因为密码将出现在URL 中,以及浏览器的历史和服务器的日志中,而且都是以普通的文本格式。它还不适合数据量大的表单和二进制数据,例如一张图片。使用GET 请求作为管理站点的表单具有安全隐患:攻击者很容易模拟表单请求来取得系统的敏感数据。POST,如果与其它的保护措施结合将对访问提供更多的控制,例如Django 的CSRF 保护。
另一个方面,GET 适合网页搜索这样的表单,因为这种表示一个GET 请求的URL 可以很容易地作为书签、分享和重新提交。

在django中构建表单

首先表单模型并不和普通的数据模型在一起,而是在forms.py

from django import forms
class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)

它定义一个Form 类,只带有一个字段(your_name)。我们已经对这个字段使用一个友好的标签,当渲染时它将出现在<label> 中(在这个例子中,即使我们省略它,我们指定的label还是会自动生成)。
字段允许的最大长度通过max_length 定义。它完成两件事情。首先,它在HTML的<input> 上放置一个maxlength="100" (这样浏览器将在第一时间阻止用户输入多于这个数目的字符)。它还意味着当Django 收到浏览器发送过来的表单时,它将验证数据的长度.
Form 的实例具有一个is_valid()方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将返回True,将表单的数据放到cleaned_data 属性中。
完整的表单,第一次渲染时,看上去将像:

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100">

form渲染的html内容中是不包括

标签和 标签的,需要自己先写好

form中的可迭代field字段

可以使用{% for %} 循环迭代每个字段来减少重复的代码:

{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}

{{ field }} 中有用的属性包括:

  • {{ field.label }}
    字段的label,例如Email address。

  • {{ field.label_tag }}
    包含在HTML

  • {{ field.id_for_label }}
    用于这个字段的ID(在上面的例子中是id_email)。如果你正在手工构造label,你可能想使用它代替label_tag。如果你有一些内嵌的JavaScript 并且想避免硬编码字段的ID,这也是有用的。

  • {{ field.value }}
    字段的值,例如someone@example.com。

  • {{ field.html_name }}
    输入元素的name 属性中将使用的名称。它将考虑到表单的前缀。

  • {{ field.help_text }}
    与该字段关联的帮助文档。

  • {{ field.errors }}
    输出一个<ul class="errorlist">,包含这个字段的验证错误信息。你可以使用{% for error in field.errors %}自定义错误的显示。 这种情况下,循环中的每个对象只是一个包含错误信息的简单字符串。

  • {{ field.is_hidden }}
    如果字段是隐藏字段,则为True,否则为False。作为模板变量,它不是很有用处,但是可以用于条件测试,例如:

{% if field.is_hidden %}  
{% endif %} 
{{ field.field }}
posted @ 2017-08-31 23:20  zijie  阅读(112)  评论(0)    收藏  举报