W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
您只需將表單實例放到模板的上下文中即可。因此,如果您的表單在上下文中叫 ?form
?,那么 ?{{ form }}
? 將渲染它相應(yīng)的 ?<label>
?和?<input>
?元素。
對于 ?<label>
? / ?<input>
? 對,還有其他輸出選項:
{{ form.as_table }}
? 會將它們呈現(xiàn)為包裹在 ?<tr>
? 標簽中的表格單元格{{ form.as_p }}
? 會將它們呈現(xiàn)在 ?<p>
? 標簽中{{ form.as_ul }}
? 會將它們呈現(xiàn)在 ?<li>
? 標簽中注意,您必須自己提供外層的 ?<table>
? 或 ?<ul>
? 元素。
下面是我們 ?ContactForm
?實例用? {{ form.as_p }}
? 的輸出:
<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_<field-name>
? 這樣的ID屬性,它被附帶的?label
?標簽引用。這對于確保表單可供屏幕閱讀軟件這樣的輔助技術(shù)訪問非常重要
我們沒有必要非要讓Django來解包表單字段;如果我們喜歡,可以手動來處理(比如,讓我們對字段重新排序)。每個字段都可以用 ?{{ form.name_of_field }}
? 作為表單的一個屬性,并被相應(yīng)的渲染在Django模板中。例如:
{{ 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>
這種靈活性的代價需要多做一點工作。到目前為止,我們不必擔(dān)心如何顯示表單的錯誤信息,因為它們已經(jīng)幫我們處理好了。下面的例子中,我們需要自己處理每個字段的錯誤信息以及表單整體的所有錯誤信息。注意表單頂部的 ?{{ form.non_field_errors }}
? 以及模板中對每個字段查找錯誤信息。
使用 ?{{ form.name_of_field.errors }}
? 顯示該字段的錯誤信息列表,它被渲染成無序列表??雌饋砣缦拢?/p>
<ul class="errorlist">
<li>Sender is required.</li>
</ul>
該列表有一個CSS class ?errorlist
?,允許您自定義其樣式。如果你想進一步自定義錯誤信息的顯示,您可以通過遍歷它們來實現(xiàn):
{% if form.subject.errors %}
<ol>
{% for error in form.subject.errors %}
<li><strong>{{ error|escape }}</strong></li>
{% endfor %}
</ol>
{% endif %}
非字段驗證錯誤信息(或者通過使用像 ?form.as_p()
? 這樣的輔助方法渲染產(chǎn)生在表單頂部的隱藏錯誤信息)渲染后會額外帶上一個class ?nonfield
?以便與字段驗證錯誤信息區(qū)分。例如, ?{{ form.non_field_errors }}
? 渲染后會像這樣:
<ul class="errorlist nonfield">
<li>Generic validation error</li>
</ul>
如果您要給每個表單字段使用相同的HTML,您可以用 ?{% for %}
? 依次循環(huán)遍歷每個字段來減少重復(fù)代碼:
{% 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
?,比如 ?Email
??address
?。
?{{ field.label_tag }}
?
該字段的?label
?封裝在相應(yīng)的HTML ?<label>
? 標簽中。它包含表單的 ?label_suffix
?。例如,默認的 ?label_suffix
?是一個冒號:
<label for="id_email">Email address:</label>
?{{ field.id_for_label }}
?
用于該字段的 ID(像上面的例子中的 id_email )。如果您要手動構(gòu)建label,您可能要用這個來替換 label_tag 。例如,如果你有一些內(nèi)嵌的JavaScript并且想要避免硬編碼字段的ID,這也很有用。
?{{ field.value }}
?
字段的值。例如 someone@example.com
?{{ field.html_name }}
?
字段名稱:用于其輸入元素的name屬性中。如果設(shè)置了表單前綴,它也會被加進去。
?{{ field.help_text }}
?
與該字段關(guān)聯(lián)的幫助文本
?{{ field.errors }}
?
輸出一個 ?<ul class="errorlist">
? ,其中包含這個字段的所有驗證錯誤信息。你可以使用 ?{% for error in field.errors %}
? 循環(huán)來自定義錯誤信息的顯示。在這種情況下,循環(huán)中的每個對象是包含錯誤信息的字符串。
?{{ field.is_hidden }}
?
如果是隱藏字段,這個屬性為 True ,否則為 False 。它作為模板變量沒多大作用,但可用于條件測試,例如:
{% if field.is_hidden %}
{# Do something special #}
{% endif %}
?{{ field.field }}
?
表單類中的 ?Field
?實例由 ?BoundField
?封裝。您可以用它來訪問 ?Field
?的屬性,比如? {{ char_field.field.max_length }}
? 。
如果您在手動布置模板中的表單,而不是依靠Django的默認表單布局,您可能希望將 ?<input type="hidden">
? 字段與非隱藏字段區(qū)別開來。例如,因為隱藏字段不顯示任何內(nèi)容,將錯誤消息放到該字段旁邊可能會導(dǎo)致用戶混淆——所以這些字段的錯誤應(yīng)該以不同的方式處理。
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 %}
這個示例沒有處理隱藏字段中的任何錯誤信息。通常,隱藏字段中的錯誤象征著表單被篡改,因為正常的表單交互不會去改變它們。但是,您也可以輕松地為這些表單錯誤插入一些錯誤信息顯示出來。
如果你的網(wǎng)站在多個地方使用相同的表單渲染邏輯,你可以通過將表單的循環(huán)保存在一個獨立的模板中,并覆蓋表單的 ?template_name
?屬性來使用自定義模板渲染表單,從而減少重復(fù)。下面的例子將導(dǎo)致 ?{{ form }}
? 被渲染成 ?form_snippet.html
? 模板的輸出。
在你的模板中:
# In your template:
{{ form }}
# In form_snippet.html:
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
在你的表單中:
class MyForm(forms.Form):
template_name = 'form_snippet.html'
...
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: