2013-02-12 78 views
5

當字段是隻讀時,我想在django admin的字段上顯示我的小部件。django admin如何在只讀字段上顯示小部件

admin.py

class AudioTrackAdminInline(admin.StackedInline): 
    model = AudioTrack 
    form = AudioTrackForm 
    readonly_fields = ('file',) 

forms.py

class AudioTrackForm(forms.ModelForm): 
    class Meta: 
     model = AudioTrack 
     widgets = { 'file': MediaFileInput, } # my widget 

當文件是不是隻讀,它顯示部件確定。但是,當我將它作爲只讀文件包含時,我會看到文本行。 (Django不會使用我的表格,如果只讀)

即使在只讀字段,我如何才能使用表格?

如何顯示其他窗口,如果我只讀設置我的領域?

回答

4

我會說這是一個功能。

當字段設置爲只讀時,Django使用display_for_field函數對結果進行硬編碼,您無法對其進行自定義。

另一種方法是不將字段設置爲只讀並覆蓋formfield_for_dbfield,這是一個未記錄的ModelAdmin方法,並根據您的需要採取相應措施。

3

另一種更靈活的解決方案是設置要以只讀模式來再現這些領域的「禁用」屬性,覆蓋您的管理類的get_form(...)方法:

def get_form(self, *args, **kwargs): 

    form = super(SupplierAdmin, self).get_form(*args, **kwargs) 

    for field_name in self.fake_readonly_fields: 
     form.base_fields[field_name].disabled = True 

    return form 

注意,我採取只讀字段的名稱不是從通常的self.readonly_fields但是從不同陣列,我叫self.fake_readonly_fields,爲了避免名稱重疊

所提出的解決方案的限制(使用formfield_for_dbfield)就是這樣,你就呈現在同樣的方式,所有的數據庫字段iven類型,它應該是隻讀的或不是。如果您的整個表單應該是隻讀的,但是如果您處理一半隻讀且一半沒有的表單,那麼這種方式很有效,最好依靠disabled屬性。

在這裏我的回答進一步的細節:django modeladmin, readonly_fields and boolean fields

+0

這應該使用''disabled'屬性Field',因爲並不是所有小工具支持(HTML)的屬性(例如用'django.contrib.gis.forms。 fields.PointField'),它可以被用戶改變!所以'form.base_fields [field_name] .disabled = True'應該被使用。 – blueyed 2016-11-03 17:25:13

相關問題