2011-05-21 81 views
3

我有一個在模型中「需要」的字段(slug),但想要將ModelAdmin類中的字段更改爲可選。如果用戶沒有填寫,則會自動填入其他字段(名稱)。如何在ModelAdmin內動態處理Django中的表單域?

class SomeModel(model.Model): 
    name = model.CharField(max_length=255) 
    slug = model.SlugField(unique=True, max_length=255) 

我試圖這樣做的各種方式,如覆蓋內的ModelAdmin get_form()或使用的ModelForm類並指定形式具體。

class SomeModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(self.__class__, self).get_form(request, obj, **kwargs) 
     form.slug.required = False 
     return form 

但是,這兩種解決方案都不適用於我。除了手動創建表單之外,還有其他更快捷的解決方案嗎?

我有很多這些形式,手工操作可能很繁瑣而且難以維護。

回答

1

在你的get_form方法中,form.fields['slug'].required應該工作。

但是,正確的方法是簡單地提供一個自定義的ModelForm。

class SomeModelForm(forms.ModelForm): 
    slug = forms.CharField(required=False) 

class SomeModelAdmin(admin.ModelAdmin): 
    form = SomeModelForm 

順便提一下,請不要做super(self.__class__, self)。在使用super時,您應該始終明確指定當前類,否則從您繼承的任何子類將繼續調用super

編輯form.fields而不是forms.fields

通過說self.__class__,你明確地停止了Python的工作繼承 - 因爲它總是指向具體的類 - 即繼承樹的底部。但是如果你的方法是那棵樹的中間部分,那麼參考super中的具體類是錯誤的 - 因爲你希望它從你所在的位置調用下一級,而不是從底部開始。這就是爲什麼你應該總是命名你所在的班級 - 在這種情況下,super(SomeModelAdmin, self)

+0

我使用'forms.fields ['slug']。required'得到了一個'AttributeError'表示字段不是一個有效的屬性。提供一個定製的表單是我試圖避免的,因爲涉及的工作量很大,因爲我有很多模型。 另外,我不完全確定爲什麼'super(self .__ class__,self)'會因爲子分類而中斷?不應該基於範圍來找出Python嗎? 感謝您關注此事。 – GoogleDroid 2011-05-21 19:28:45

+0

再次感謝!這是我的一個錯字,但在我的代碼中是正確的,但仍然無法正常工作。我發現從'get_form'返回的表單的類型是'django.forms.models.ModelFormMetaclass'。 'dir(form)'也沒有顯示字段屬性。 – GoogleDroid 2011-05-21 21:01:46

0

我只是想報告,以防其他人可能會覺得這有用。

我從來沒有能夠在get_form方法做form.fields['slug'].required並永遠不知道爲什麼。但是,我通過創建一個從ModelForm繼承的新窗體來解決我的問題。

我不得不重寫INIT()來設置self.fields['slug'].required = False調用父構造後,然後覆蓋clean_slug()修改蛞蝓字段內容如果需要通過訪問self.data['slug']

希望這可以幫助別人

4

同樣的問題摔跤自己,當通過谷歌找到了這個網頁。下面也將在ModelAdmin工作:

def get_form(self, *args, **kwargs): 
    form = super(SomeModelAdmin, self).get_form(*args, **kwargs) 
    form.base_fields['slug'].required = False 
    return form 

從更新ModelFormMetaclass創建將有slug場不需要的後續形式。

這在我的情況下效果更好,在那裏我只有一個類,在該類中我需要重新獲取該字段,並且不需要在保存時進行任何數據轉換。如果你有很多類,或者數據轉換是必要的,GoogleDroid的解決方案會更好。