Django 使用表單模板

2022-07-20 17:48 更新

簡介

除非您打算建立只發(fā)布內(nèi)容的網(wǎng)站和應(yīng)用程序,并且不接受訪問者的輸入,否則您將需要理解和使用表格。

Django提供了一系列工具和庫,可幫助您構(gòu)建表單以接受來自站點訪問者的輸入,然后處理并響應(yīng)輸入。


HTML表單

在HTML中,表單是內(nèi)部元素的集合<form>...</form>,允許訪問者執(zhí)行諸如輸入文本,選擇選項,操作對象或控件等操作,然后將該信息發(fā)送回服務(wù)器。

其中一些表單界面元素(文本輸入或復(fù)選框)內(nèi)置于HTML本身。其他則要復(fù)雜得多。彈出日期選擇器或允許您移動滑塊或操縱控件的界面通常將使用JavaScript和CSS以及HTML表單<input>元素來實現(xiàn)這些效果。

<input>表單及其元素還必須指定兩件事:

  • 其中:應(yīng)將與用戶輸入相對應(yīng)的數(shù)據(jù)返回到的URL
  • 如何:數(shù)據(jù)應(yīng)通過的HTTP方法

Django表單處理流程

Django 的表單處理:視圖獲取請求,執(zhí)行所需的任何操作,包括從模型中讀取數(shù)據(jù),然后生成并返回HTML頁面(從模板中),我們傳遞一個包含要顯示的數(shù)據(jù)的上下文。使事情變得更復(fù)雜的是,服務(wù)器還需要能夠處理用戶提供的數(shù)據(jù),并在出現(xiàn)任何錯誤時,重新顯示頁面。

Django表單處理的主要內(nèi)容:

  1. 在用戶第一次請求時,顯示默認表單。表單可能包含空白字段(例如,如果您正在創(chuàng)建新記錄),或者可能預(yù)先填充了初始值(例如,如果您要更改記錄,或者具有有用的默認初始值)。此時表單被稱為未綁定,因為它與任何用戶輸入的數(shù)據(jù)無關(guān)(盡管它可能具有初始值)。
  2. 從提交請求接收數(shù)據(jù),并將其綁定到表單。將數(shù)據(jù)綁定到表單,意味著當(dāng)我們需要重新顯示表單時,用戶輸入的數(shù)據(jù)和任何錯誤都可取用。
  3. 清理并驗證數(shù)據(jù)。清理數(shù)據(jù)會對輸入執(zhí)行清理(例如,刪除可能用于向服務(wù)器發(fā)送惡意內(nèi)容的無效字符)并將其轉(zhuǎn)換為一致的 Python 類型。驗證檢查值是否適合該字段(例如,在正確的日期范圍內(nèi),不是太短或太長等)
  4. 如果任何數(shù)據(jù)無效,請重新顯示表單,這次使用任何用戶填充的值,和問題字段的錯誤消息。
  5. 如果所有數(shù)據(jù)都有效,請執(zhí)行必要的操作(例如保存數(shù)據(jù),發(fā)送表單和發(fā)送電子郵件,返回搜索結(jié)果,上傳文件等)
  6. 完成所有操作后,將用戶重定向到另一個頁面。

Django表單分為兩種使用方法:

  • GET
  • POST

GET 方法

  1.  瀏覽器請求一個頁面
  2. 搜索引擎檢索關(guān)鍵字的時候

GET方法是通過鍵值對的方式顯示從用戶那邊獲取的數(shù)據(jù),然后通過“&”將其組合形成一個整體的字符串,最后加上“?”,將組合后的字符串拼接到URL內(nèi),生成一個url地址。它既不適用于大量數(shù)據(jù),也不適合于二進制數(shù)據(jù)(例如圖像)。使用GET 管理表單請求的Web應(yīng)用程序存在安全風(fēng)險:攻擊者很容易模仿表單的請求來訪問系統(tǒng)的敏感部分。GET僅應(yīng)用于不影響系統(tǒng)狀態(tài)的請求。諸如Web搜索表單類,它可以輕松對請求到的URL進行共享,提交等操作。

POST 方法

  1. 瀏覽器打包數(shù)據(jù)
  2. 以編碼的形式進行傳輸
POST可以更改系統(tǒng)狀態(tài)的任何請求,利用POST方法,瀏覽器可以將表單數(shù)據(jù)進行打包操作,然后以編碼的方式進行傳輸,最后將它發(fā)送到服務(wù)器,并接收對其進行響應(yīng)。

Django在表單中的角色

處理表格是一項復(fù)雜的業(yè)務(wù)??紤]一下Django的管理員,其中可能需要準備好幾種不同類型的大量數(shù)據(jù),以表格形式顯示,呈現(xiàn)為HTML,使用便利的界面進行編輯,返回到服務(wù)器,進行驗證和清理,然后保存或傳遞進行進一步處理。

Django的表單功能可以簡化和自動化大部分工作,并且比大多數(shù)程序員在編寫自己的代碼中所能做到的更加安全。

Django處理涉及表單的工作的三個不同部分:

  • 準備和重組數(shù)據(jù)以使其準備好呈現(xiàn)
  • 為數(shù)據(jù)創(chuàng)建HTML表單
  • 接收并處理客戶提交的表格和數(shù)據(jù)

這是有可能到手動做這一切寫代碼,但Django的可以照顧這一切為您服務(wù)。

Django中的表單

我們已經(jīng)簡要描述了HTML表單,但是HTML <form>只是所需機制的一部分。

在Web應(yīng)用程序的上下文中,“表單”可能是指該HTML <form>或Form生成它的Django ,或者是提交時返回的結(jié)構(gòu)化數(shù)據(jù),或者是這些部分的端到端工作集合。

Django Form類

該組件系統(tǒng)的核心是Django的Form類。類與Django模型描述對象的邏輯結(jié)構(gòu),其行為以及向我們表示其部分的方式幾乎相同,一個 Form類描述一種形式并確定其工作方式和外觀。

就像模型類的字段映射到數(shù)據(jù)庫字段一樣,表單類的字段映射到HTML表單<input>元素。(A 通過;ModelForm 將模型類的字段映射到HTML表單<input>元素 Form,這是Django管理員所基于的。)

表單的字段本身就是類。他們管理表單數(shù)據(jù)并在提交表單時執(zhí)行驗證。一個DateField和 FileField手柄非常不同類型的數(shù)據(jù),并有做不同的事情吧。

表單字段在瀏覽器中以HTML“窗口小部件”的形式向用戶表示-一種用戶界面機制。每個字段類型都有一個適當(dāng)?shù)哪J Widget類,但是可以根據(jù)需要覆蓋它們。

實例化,處理和呈現(xiàn)表單

在Django中渲染對象時,通常:

  1. 在視圖中獲取它(例如,從數(shù)據(jù)庫中獲取它)
  2. 傳遞給模板上下文
  3. 使用模板變量將其擴展為HTML標記

在模板中呈現(xiàn)表單與呈現(xiàn)任何其他類型的對象幾乎涉及相同的工作,但是存在一些關(guān)鍵區(qū)別。

對于不包含數(shù)據(jù)的模型實例,在模板中執(zhí)行任何操作幾乎是沒有用的。另一方面,呈現(xiàn)未填充的表單非常有意義-當(dāng)我們希望用戶填充它時,這就是我們要做的。

因此,當(dāng)我們在視圖中處理模型實例時,通常會從數(shù)據(jù)庫中檢索它。當(dāng)我們處理表單時,通常在視圖中實例化它。

實例化表單時,我們可以選擇將其保留為空或預(yù)先填充,例如:

  • 來自已保存模型實例的數(shù)據(jù)(例如用于編輯的管理表單)
  • 我們從其他來源收集的數(shù)據(jù)
  • 從先前的HTML表單提交中收到的數(shù)據(jù)

這些情況中的最后一個是最有趣的,因為它使用戶不僅可以閱讀網(wǎng)站,而且還可以向其發(fā)送信息。

構(gòu)建形式

這方面還需要做需要的工作

假設(shè)您想在您的網(wǎng)站上創(chuàng)建一個簡單的表單,以獲得用戶名。您在模板中需要這樣的內(nèi)容:

<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

這告訴瀏覽器/your-name/使用POST方法將表單數(shù)據(jù)返回到URL 。它將顯示一個文本字段,標記為“您的姓名:”,以及一個標記為“確定”的按鈕。如果模板上下文包含一個current_name 變量,它將用于預(yù)填充該your_name字段。

您將需要一個視圖來呈現(xiàn)包含HTML表單的模板,并且可以提供current_name適當(dāng)?shù)淖侄巍?/p>

提交表單后,POST發(fā)送到服務(wù)器的請求將包含表單數(shù)據(jù)。

現(xiàn)在,您還將需要一個與該/your-name/URL 對應(yīng)的視圖,該視圖將在請求中找到適當(dāng)?shù)逆I/值對,然后對其進行處理。

這是一個非常簡單的形式。實際上,一個表單可能包含數(shù)十個或數(shù)百個字段,其中許多字段可能需要預(yù)先填充,并且我們可能希望用戶在結(jié)束操作之前先完成幾次編輯-提交循環(huán)。

甚至在提交表單之前,我們可能需要在瀏覽器中進行一些驗證;我們可能想使用更復(fù)雜的字段,使用戶可以執(zhí)行諸如從日歷中選擇日期之類的操作。

在這一點上,讓Django為我們完成大部分工作要容易得多。

在Django中建立表單

本Form類

我們已經(jīng)知道我們想要HTML表單的外觀了。我們在Django中的起點是:

的forms.py 
from django import forms

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

這定義了一個Form具有單個字段(your_name)的類。我們在該字段上應(yīng)用了一個人類友好的標簽,該標簽將在<label>呈現(xiàn)時顯示在標簽上(盡管在這種情況下,label 我們指定的標簽實際上與省略該標簽時會自動生成的標簽 相同)。

字段的最大允許長度由定義 max_length。這有兩件事。它放在 maxlength="100"HTML上<input>(因此瀏覽器應(yīng)首先防止用戶輸入超過該數(shù)量的字符)。這也意味著,當(dāng)Django從瀏覽器接收回表單時,它將驗證數(shù)據(jù)的長度。

一個Form實例有一個is_valid()方法,它運行于所有的字段驗證程序。調(diào)用此方法時,如果所有字段都包含有效數(shù)據(jù),它將:

  • 返回 True
  • 將表單的數(shù)據(jù)放在其cleaned_data屬性中。

首次渲染時,整個表單將如下所示:

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

請注意,它不包含<form>標簽或提交按鈕。我們必須在模板中提供這些信息。

視圖

發(fā)送回Django網(wǎng)站的表單數(shù)據(jù)由視圖處理,通常與發(fā)布表單的視圖相同。這使我們可以重用某些相同的邏輯。

要處理表單,我們需要在視圖中將其實例化的URL實例化為:

的views.py 
from django.http import HttpResponseRedirect
from django.shortcuts import render

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})

如果我們通過GET請求到達此視圖,它將創(chuàng)建一個空表單實例并將其放置在要呈現(xiàn)的模板上下文中。這是我們第一次訪問URL時可以預(yù)期的情況。

如果表單是使用POST請求提交的,則視圖將再次創(chuàng)建表單實例,并使用請求中的數(shù)據(jù)填充該表單實例:這稱為“將數(shù)據(jù)綁定到表單”(現(xiàn)在是綁定表單)。form = NameForm(request.POST)

我們稱為表單的is_valid()方法;如果不是True,我們返回帶有表單的模板。這次,表單不再是空的(未綁定),因此將使用先前提交的數(shù)據(jù)填充HTML表單,并可以在其中根據(jù)需要對其進行編輯和更正。

如果is_valid()為True,我們現(xiàn)在將能夠在其cleaned_data屬性中找到所有經(jīng)過驗證的表單數(shù)據(jù)。我們可以使用此數(shù)據(jù)來更新數(shù)據(jù)庫或進行其他處理,然后再將HTTP重定向發(fā)送到瀏覽器,告訴瀏覽器下一步該怎么做。

模板

我們不需要在name.html模板中做很多事情:

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

表單的所有字段及其屬性將通過Django的模板語言從中解壓縮為HTML標記。{{ form }}

表格和跨站點請求偽造保護

Django隨附了易于使用的跨站點請求偽造保護。在POST啟用CSRF保護的情況下提交表單時,必須csrf_token像前面的示例一樣使用template標記。但是,由于CSRF保護并不直接與模板中的表單相關(guān)聯(lián),因此在本文檔的以下示例中省略了此標簽。

HTML5輸入類型和瀏覽器驗證

如果表單包括URLField,一個 EmailField或任何整數(shù)字段類型,Django會使用的url,email和numberHTML5輸入類型。默認情況下,瀏覽器可以在這些字段上應(yīng)用自己的驗證,這可能比Django的驗證更嚴格。如果您想禁用此行為,請novalidate在form標簽上設(shè)置屬性,或在字段上指定其他小部件,例如TextInput。

現(xiàn)在,我們有了一個工作的Web表單,該表單由Django描述Form,由視圖處理并呈現(xiàn)為HTML <form>。

這就是您入門所需的全部內(nèi)容,但是表單框架為您提供了更多便利。一旦了解了上述過程的基礎(chǔ),就應(yīng)該準備了解表單系統(tǒng)的其他功能,并準備進一步了解基礎(chǔ)機械。

有關(guān)Django Form類的更多信息

所有表單類均作為django.forms.Form 或的子類創(chuàng)建django.forms.ModelForm。您可以將其ModelForm視為的子類Form。Form并ModelForm實際上從(私有)BaseForm類繼承通用功能,但是這種實現(xiàn)細節(jié)很少很重要。

模型和形式

實際上,如果您的表單將用于直接添加或編輯Django模型,那么ModelForm可以節(jié)省大量的時間,精力和代碼,因為它可以構(gòu)建表單以及適當(dāng)?shù)淖侄渭捌鋵傩?,來自一Model堂課。

綁定表單實例和未綁定表單實例

綁定形式和未綁定形式之間的區(qū)別很重要:

  • 未綁定的表單沒有與之關(guān)聯(lián)的數(shù)據(jù)。呈現(xiàn)給用戶時,它將為空或包含默認值。
  • 綁定表單已提交數(shù)據(jù),因此可以用來判斷該數(shù)據(jù)是否有效。如果呈現(xiàn)了無效的綁定形式,則它可能包含內(nèi)聯(lián)錯誤消息,告訴用戶要糾正哪些數(shù)據(jù)。

表單的is_bound屬性將告訴您表單是否綁定了數(shù)據(jù)。

更多的字段

考慮一個比上面的最小示例更有用的形式,我們可以使用該形式在個人網(wǎng)站上實現(xiàn)“與我聯(lián)系”功能:

的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)

我們之前的形式使用的單場,your_name,一CharField。在這種情況下,我們的表單有四個字段:subject,message,sender和 cc_myself。CharField,EmailField并且 BooleanField只有三個可用的字段類型; 完整列表可以在“ 表單”字段中找到。

小部件

每個表單字段都有一個對應(yīng)的Widget類,該類又對應(yīng)于HTML表單小部件,例如。<input type="text">

在大多數(shù)情況下,該字段將具有明智的默認小部件。例如,默認情況下,a CharField將具有在HTML TextInput中生成a的小部件。如果需要 ,可以在定義表單字段時指定適當(dāng)?shù)男〔考?,就像我們對字段所做的那樣?lt;input type="text"><textarea>message

現(xiàn)場數(shù)據(jù)

無論通過表單提交的數(shù)據(jù)是什么,一旦通過調(diào)用成功驗證is_valid()(并is_valid()返回True),經(jīng)過驗證的表單數(shù)據(jù)都將位于form.cleaned_data字典中。這些數(shù)據(jù)將為您很好地轉(zhuǎn)換為Python類型。

注意

此時,您仍然可以直接訪問未經(jīng)驗證的數(shù)據(jù)request.POST,但是經(jīng)過驗證的數(shù)據(jù)更好。

在上面的聯(lián)系表單示例中,cc_myself將為布爾值。同樣,諸如IntegerField和FloatField將值分別轉(zhuǎn)換為Python int和的字段float。

以下是在處理此表單的視圖中如何處理表單數(shù)據(jù)的方法:

的views.py 
from 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/')

小費

有關(guān)從Django發(fā)送電子郵件的更多信息,請參見發(fā)送電子郵件。

一些字段類型需要一些額外的處理。例如,使用表單上傳的文件需要進行不同的處理(可以從而request.FILES不是從中檢索它們 request.POST)。有關(guān)如何處理表單上載文件的詳細信息,請參閱將上載的文件綁定到表單。

與表單模板工作

將表單放入模板所需要做的就是將表單實例放入模板上下文中。因此,如果您的表單是form在上下文中調(diào)用的,則將適當(dāng)?shù)爻尸F(xiàn)其和元素。{{ form }}<label><input>

形成渲染選項

附加表格模板家具

不要忘了,一個形式的輸出并沒有包括周圍的 <form>標簽,或窗體的submit控制。您必須自己提供這些。

<label>/ <input>對還有其他輸出選項:

  • {{ form.as_table }}將它們呈現(xiàn)為包裝在<tr> 標簽中的表格單元格
  • {{ form.as_p }}將它們包裹在<p>標簽中
  • {{ form.as_ul }}將它們包裹在<li>標簽中

請注意,您必須自己提供周圍環(huán)境<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屬性設(shè)置為id_<field-name>,由隨附的標簽標記引用。這對于確保輔助技術(shù)(例如屏幕閱讀器軟件)可訪問表單很重要。您還可以自定義標簽和ID的生成方式。

有關(guān)更多信息,請參見將表單輸出為HTML。

手動渲染領(lǐng)域

我們不必讓Django解壓縮表單字段;我們可以根據(jù)需要手動進行操作(例如,允許我們對字段進行重新排序)。每個字段都可以使用用作表單的屬性,并且在Django模板中將適當(dāng)?shù)爻尸F(xiàn)。例如:{{ 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>

呈現(xiàn)形式的錯誤消息

當(dāng)然,這種靈活性的代價是更多的工作。到目前為止,我們不必擔(dān)心如何顯示表單錯誤,因為這已經(jīng)為我們解決了。在此示例中,我們必須確保處理每個字段的所有錯誤以及整個表單的所有錯誤。請注意在表單和模板查找的頂部,以查找每個字段上的錯誤。{{ form.non_field_errors }}

使用顯示格式錯誤列表,并顯示為無序列表??赡芸雌饋硐瘢簕{ form.name_of_field.errors }}

<ul class="errorlist">
    <li>Sender is required.</li>
</ul>

該列表的CSS類errorlist允許您設(shè)置外觀樣式。如果您希望進一步自定義錯誤的顯示,可以通過遍歷它們來實現(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())將通過附加的類別呈現(xiàn),nonfield以幫助將其與特定于字段的錯誤區(qū)分開。例如,如下所示:{{ form.non_field_errors }}

<ul class="errorlist nonfield">
    <li>Generic validation error</li>
</ul>

有關(guān)錯誤,樣式以及如何在模板中使用表單屬性的更多信息,請參見Forms API。

遍歷表單的字段

如果您對每個表單字段使用相同的HTML,則可以通過使用 循環(huán)依次遍歷每個字段來減少重復(fù)代碼:{% 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 }}

字段的標簽包裝在適當(dāng)?shù)腍TML <label>標記中。這包括表格的label_suffix。例如,默認label_suffix值為冒號:

<label for="id_email">Email address:</label>
{{ field.id_for_label }}
將用于此字段的ID(id_email在上面的示例中)。如果您是手動構(gòu)建標簽,則可能要使用它代替label_tag。例如,如果您有一些內(nèi)聯(lián)JavaScript并希望避免對字段ID進行硬編碼,它也很有用。
{{ field.value }}
字段的值。例如someone@example.com
{{ field.html_name }}
輸入元素的名稱字段中將使用的字段名稱。如果已設(shè)置,則將格式前綴考慮在內(nèi)。
{{ field.help_text }}
與該字段關(guān)聯(lián)的任何幫助文本。
{{ field.errors }}
輸出一個,其中包含與此字段對應(yīng)的任何驗證錯誤。您可以使用循環(huán)自定義錯誤的表示形式。在這種情況下,循環(huán)中的每個對象都是一個包含錯誤消息的字符串。<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 }}

也可以看看

有關(guān)屬性和方法的完整列表,請參見 BoundField

遍歷隱藏和可見字段

如果您要手動在模板中布置表單,而不是依賴Django的默認表單布局,則可能需要將 字段與非隱藏字段區(qū)別對待。例如,由于隱藏字段不顯示任何內(nèi)容,因此將錯誤消息放在該字段旁邊可能會給您的用戶造成混亂-因此,應(yīng)對這些字段的錯誤進行不同的處理。<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 %}

本示例不處理隱藏字段中的任何錯誤。通常,隱藏字段中的錯誤是表單被篡改的標志,因為正常的表單交互不會改變它們。但是,您也可以輕松地為這些表單錯誤插入一些錯誤顯示。

可重復(fù)使用的表單模板

如果您的站點在多個位置對表單使用相同的呈現(xiàn)邏輯,則可以通過將表單的循環(huán)保存在獨立模板中并使用include標簽在其他模板中重用它來減少重復(fù):

# 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參數(shù)對其進行別名include:

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

如果您發(fā)現(xiàn)自己經(jīng)常這樣做,則可以考慮創(chuàng)建一個自定義 包含標簽。

詳情參考: https://docs.djangoproject.com/en/3.0/topics/forms/#working-with-form-templates


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號