2009-12-15 60 views
6

我正在如何在Django中最好地創建HTML頁面,可以用於顯示或編輯數據。也就是說,我希望字段的值在顯示模式下顯示爲文本,而在編輯/添加模式下則顯示在他們的窗口小部件中。看起來,Django並沒有設計成這樣:字段總是出現在它們的小部件中(例如,文本輸入,文本區域, 等)。使用Django Forms來顯示和編輯?

是否有處理這種常見的技術,使用短的形式之一,而不是其他?

我在想,可用於任何形式的領域,如自定義templatetag過濾器:

{{form.field_name | render_field:模式}}

其中render_field要麼返回字段的HTML小部件,或者僅僅是基於模式的文本值。

我錯過了一些東西,或者這是一個可行的解決方案?

回答

3

回答我自己的問題,顯然。我結束了三部分的解決方案:

  1. 附加模型的形式,所以我必須每場
  2. 使用模板標籤寫的形式默認的顯示部件,其傳遞的形式點域,用戶和行動
  3. 寫渲染模板標籤來處理#2

步驟一:

 
form.model = Model(...) 

第二步:

 

{{form.field1.label}} 
{% render form.field1 user action %} 


{{form.field2.label}} 
{% render form.field2 user action %} 

步驟三:

喜歡的東西:

 
def render(formfield, user, action, default_text="Private"): 
    if not user.is_authenticated(): 
     action = "view" 
    if action == "view": 
     if user.is_authenticated(): 
      fieldname = formfield.name 
      retval = str(getattr(formfield.form.model, fieldname)) 
     else: 
      retval = default_text 
    else: 
     retval = formfield.as_widget() 
    return retval 
0

由於要保存的數據,您必須連接到形式莫名其妙的模型,一個的ModelForm與否。因此,您可以直接使用該模型來獲取值並將其呈現在您想要的模板中。

上述建議是可行的,但由於形式可以是相當複雜的,它可能不是一件容易的事還是值得的麻煩。取決於你想要這麼做的頻率。但是,這可能會更容易爲模型而不是表單創建過濾器。

在主模板
+0

是的,我可以只使用模型,但是這並不採取任何形式可以做到優勢。過濾器與此有什麼關係?我有很多顯示/編輯視圖,所以一個好的選擇可以讓我們不必每次做兩次(一次用於顯示,一次用於編輯)。 – 2009-12-15 13:49:47

0

{% if form %} 
    {% include 'form.html' %} 
{% else %} 
    {% include 'display.html' %} 
{% endif %} 

那麼這兩個模板將只是呈現形式的一部分,或者一個漂亮的有組織的股利。 這樣,編輯視圖將會定義一個表單,而顯示視圖則不會。這將比你想要做的更容易跟蹤(即使你正在嘗試的應該是可能的,我相信你的方法會在性能上受到影響)。

我這樣做在博客應用程序,以便編輯頁面看起來就像頁面的顯示,因此使得它非常直觀編輯/寫博客條目。 (更何況這讓我可以很輕鬆地把一些Ajax在編輯條目的任何視圖中有一些不錯的奇特的效果)

+0

這正是我不想做的。我不想有兩種形式,只有一種。 – 2010-01-16 15:38:03

0

有我錯過了什麼

形式不僅顯示領域的小部件,但也處理帖子數據。發送的帖子會導致它處理數據清理,表單和字段錯誤處理等。

這是一種打破模式 - 爲什麼創建和渲染表單對象只是爲了調整它看起來不像表單?

如果你擔心太多工作的模板,嘗試用模板繼承來解決它的最好的方式。如果你非常確定要只改變字段標籤,就可以使某物像

{% if form %} 
    {% for error in form.field.errors %} 
     {{ error|escape }} 
    {% endfor %} 
    {{ form.field }} 
{% else %} 
    {{ object.field }} 
{% endif %} 

的各個領域,但IMO這不是問題的關鍵,情況因人而異。

還想到什麼(你的解決方案的思維)是動態附加部件到表單域,但會被過度設計。

0

我有同樣的問題。現在我有用於顯示和編輯的單獨模板;前者呈現對象字段,後者表示字段(但有時也包含對象字段,用於不可編輯的事物)。 HTML結構可能非常複雜:例如,在一些頁面上,我有大型表格表示對象的多級分層結構。結果,我最終在兩個模板中出現了大量重複的代碼,這與DRY相反。

我在表單字段之前使用了模板過濾器,以便在與字段一起顯示錯誤時保存代碼。我認爲這將是一個可行的解決方案。另一種可能性可能是使用ModelForm子類,它可以被告知呈現不可用的字段版本。這將有助於保持模板簡單。您甚至可以渲染字段的靜態和可編輯版本,並使用JavaScript在它們之間切換,激活和停用編輯模式。