在Django中創(chuàng)建表單
-
表單
# forms.py from django import forms class NameForm(forms.Form): your_name = forms.CharField(label='Your name', max_length=100)這里需要注意的是:
-
label參數(shù)可以被忽略,Django會自動為該列生成一個label(其實此處label指定的名稱同Django自動生成的名稱是一樣的) -
max_length在HTML的表單中指定了對應(yīng)列的maxlength屬性,同時也會對瀏覽器表單提交的內(nèi)容長度進行合理化處理 - 每個Form實例對象有一個
is_valid()方法,當表單所有列都符合要求時,調(diào)用該方法會:- 返回True
- 將表單數(shù)據(jù)存入
cleaned_data屬性中
最終上述Django中創(chuàng)建的表單在HTML中的顯示為:
<label for="your_name">Your name: </label> <input id="your_name" type="text" name="your_name" maxlength="100" required />注意:
- 此處并不包含
<form>標簽 - 亦不包含提交按鈕
上邊兩項都需要自己手動在HTML中添加
-
-
視圖函數(shù)
from django.shortcuts import render from django.http import HttpResponseRedirect from .forms import NameForm def get_name(request): # if this is a POST request we need to process the form data if request.method == 'POST': # create a form instance and populate it with data from the request: form = NameForm(request.POST) # check whether it's valid: if form.is_valid(): # process the data in form.cleaned_data as required # ... # redirect to a new URL: return HttpResponseRedirect('/thanks/') # if a GET (or any other method) we'll create a blank form else: form = NameForm() return render(request, 'name.html', {'form': form})所有有用信息都在代碼的注釋中
-
模板
<form action="/your-name/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit" /> </form>{{ form }}變量中的表單內(nèi)容會被自動分離并展示出來
在一些瀏覽器中,對url,eamil,number等標簽的合理性檢測比Django更為嚴格,此時可以不使用Django的URLField,EmailField等,而使用例如TextField代替。
Django的Form classes
-
綁定表單實例v.s.非綁定表單實例
- 一個非綁定表單不和任何數(shù)據(jù)相關(guān)聯(lián)
- 一個綁定表單包含提交的數(shù)據(jù),可以用來告訴用戶該數(shù)據(jù)是否合理(若包含的是不合理數(shù)據(jù),其可以通過錯誤信息來告知用戶哪種數(shù)據(jù)是合理的)
通過表單的
is_bound數(shù)據(jù)來告知該表單是否綁定數(shù)據(jù)
更多的表單類型
# forms.py
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
widgets
每個表單列都有一個對應(yīng)的widget class用來指定HTML的表單中<input>標簽的type屬性
大多數(shù)情況下,每個field都有自己默認的widget,但我們也可以通過widget參數(shù)來顯式地指定需要的type類型
成功提交的數(shù)據(jù)會以字典的形式保存在表單對象的cleaned_data屬性中
# views.py
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']
注意,一些字段需要其它的處理方式;比方上傳的文件就位于request.FILES中
處理模板中的表單
{{ form }}模板變量將根據(jù)定義字段自動生成<label>和<input>標簽
{{ form.as_p }}, {{ form.as_table }}, {{ from.as_ul }}將會在每個表單列上分別添加<p>, <tr>和<li>標簽(不要忘記<table>和<ul>標簽的使用)
上邊ContactForm通過{{ from.as_p }}得到的HTML表單:
<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>
注意Django會自動生成label和id
-
通過字段手動生成表單
{{ 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>{{ form.non_field_errors }}標簽變量將顯示任何非字段錯誤的信息
<label>標簽也可以通過使用label_tag()方法實現(xiàn)<div class="fieldWrapper"> {{ form.subject.errors }} {{ form.subject.label_tag }} {{ form.subject }} </div>{{ form.name_of_field.errors }}將以列表的形式展示出現(xiàn)的錯誤,并指定一個CSS類errorlist<ul class="errorlist"> <li>Sender is required.</li> </ul>根據(jù)需要也可以遍歷錯誤
-
遍歷表單的字段
使用{% for %}循環(huán)來遍歷表單中的字段{% 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>這一HTML標簽) -
{{ field.label_tag }}:將字段的標簽包裹在<label>標簽中 -
{{ field.id_for_label }}:字段的id {{ field.value }}{{ field.html_name }}{{ field.help_text }}{{ field.errors }}-
{{ field.is_hidden }}:布爾型 - `{{ field.field }}
注意上述的屬性也適用于前一個手動生成表單的方法
-
-
遍歷隱藏字段和可見字段
{# 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 %}