我想在Django管理,以显示我的场上窗口小部件时该字段为readonly。
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不使用我的形式,如果只读)
我怎样才能得到它,即使在只读领域使用的形式?
要么
如何显示其他窗口,如果我只读设置我的领域?
我会说这是一个特点。
当字段设置为只读,Django使用display_for_field
函数的硬编码的结果,你不能自定义它。
另一种方法是不以只读方式设置字段并覆盖formfield_for_dbfield
,一个未公开ModelAdmin
方法和采取相应的行动,以您的需求。
另一种更灵活的解决方案是设置要以只读模式来再现这些领域的“禁用”属性,覆盖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
)就是以这种方式使你在同样的方式给定类型的所有数据库字段,阉应该还是不只读的。 这样一来工作,如果你的整个形式应该是只读的,但如果你是半只读一半没有交易的形式,最好是依靠disabled
属性。
:在我的答案在这里的更多细节的Django的ModelAdmin,readonly_fields和布尔字段