2011-10-27 17 views
8

我知道,默認情況下,Django會在使用格式id_for_%s進行呈現時爲每個表單字段自動填充id。可以通過提供auto_id參數以不同格式作爲其Form值構造函數的值來修改格式。Django:更改表單字段級別的DOM ID

然而這並不是我正在尋找的東西。我想要完成的是改變我表格中許多領域中僅有的一個領域的ID。此外,解決方案不應該打破使用form = MyForm(request.POST)

PS。 MyForm是一個模型表單,所以每個id都是從其相應的Model字段派生而來的。

感謝您的幫助。

+0

你能使用脫身類?這肯定是更容易,更不容易出錯(只需修改小部件)。 – sdolan

+0

@sdolan - 我忘了提及這個問題是關於模型的形式。我正在尋找除了更改模型字段名稱之外的解決方案。 – tamakisquare

+0

你不需要。當你構建'ModelForm'時,它只是更新字段的小部件。如果這可行,我會發佈一個完整的解決方案作爲答案。 – sdolan

回答

15

的形式框架將出現在這裏生成標籤:

def _id_for_label(self): 
    """ 
    Wrapper around the field widget's `id_for_label` class method. 
    Useful, for example, for focusing on this field regardless of whether 
    it has a single widget or a MutiWidget. 
    """ 
    widget = self.field.widget 
    id_ = widget.attrs.get('id') or self.auto_id 
    return widget.id_for_label(id_) 
id_for_label = property(_id_for_label) 

這意味着你可以用一個「id」鍵將其設置爲任何你想提供您的字段的控件。

foo = forms.CharField(widget=forms.TextInput(attrs={'id': 'foobar'})) 

或覆蓋init並在表單初始化後設置attrs。

我不明白這是如何打破形式Django的表單框架是不是永遠知道HTML的id(即數據不傳遞到服務器...)

+2

Yuji - 你說得對。改變_id_並不會破壞django的表單框架。我得到了html屬性_name_和_id_混合起來。它是Django依賴將表單映射回模型實例的_name_屬性。感謝你的回答。 – tamakisquare