2011-04-19 32 views
2

我想單獨解析我的Modelform的字段,而不是for循環。我想要一些字段來解析該元素的Django HTML。 我有這樣的:Django,如何解析沒有for循環的單個表單字段(HTML)

<form action="#" method="POST" name="notifictaionForm"> 
    <ul> 
     <li><label>{{ form.fields.title.label }}</label> <span>{{ notification.title }}</span></li> 
     <li><label>{{ form.fields.create_date.label }}</label> <span>{{ notification.create_date }}</span></li> 
     <li><label>{{ form.fields.description.label }}</label> <span>{{ notification.description }}</span></li> 
     <li><label>{{ form.fields.status.label }}</label> <span>{{ form.fields.status.??? }}</span></li> 
    </ul> 
</form> 

這樣我就可以分析字段的名稱,但不是HTML元素,我想在模板代碼解析Django的HTML表單元素的???

有人知道如何做到這一點嗎?

回答

9

如果我已經很好地理解了你,你想要django的status字段的自動生成的html?然後,它是非常簡單的:

{{ form.status }} 

很少有多餘的話:

的形式是,場可以這樣訪問類似字典的對象:

>>> form['field_name'] 

聲明的字段存儲在form.fieldsSortedDict對象。所以你可以使用這個變量來訪問字段,但是推薦的方式總是最短的。

如果你是新來的Python,你可能不知道怎麼會這樣,你聲明字段屬性,但是你是不是能夠從Python代碼訪問它們是這樣的:

>>> form.field_name 
AttributeError: 'Form' object has no attribute 'field_name' 

那麼這是因爲python中的類不是靜態的,元類可以用來從類定義中構建所有類型的新事物。 Django利用它來創建一個友好的API。基本上它是這樣的:

  1. Python解釋器解析你的Form類。
  2. 解釋器發現__metaclass__屬性從django.forms.Form繼承,並設置爲:DeclarativeFieldsMetaclass
  3. 元類重組你的班級。屬性被刪除並且.base_fields屬性被創建。
  4. 爲什麼base_fields不是fields?那麼這又是另外一回事了,這與ModelForm中來自模型的字段如何與Form類中聲明的字段分離有關。

但不要混淆元類與class Meta,它有時用於向窗體或模型提供額外的配置選項。

立即返回模板。你不能從python代碼訪問form.field_name,爲什麼然後它可以在模板中?作爲django documentation描述的,當模板系統遇到一個點,它會嘗試以下查找,順序如下:

  • 字典查找
  • 屬性查找
  • 方法調用
  • 列表索引查找

這意味着第一件事情模板系統在遇到時會嘗試返回:{{ form.field_name }}是:form['field_name']

+0

謝謝你!我認爲,我不得不使用form.fields對象,因爲每個Django文檔循環的例子。 – 2011-04-19 11:42:26

+0

添加了幾個額外的單詞,我希望知道:) – Ski 2011-04-19 13:15:41

+0

+1真的很好的答案! – jathanism 2011-04-19 13:44:21