我希望在字段为readonly时在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
当文件不是只读时,它会显示小部件确定。但当我把它作为readonly包含时,我看到文本行。 (如果只读,Django不会使用我的表格)
即使在只读字段,如何才能使用表单?
或
如果我将字段设置为只读,如何显示另一个小部件?
答案 0 :(得分:6)
我会说这是一个功能。
当字段设置为只读时,Django使用display_for_field
函数对结果进行硬编码,您无法对其进行自定义。
另一种方法是不将该字段设置为只读并覆盖formfield_for_dbfield
,这是一种未记录的ModelAdmin
方法,并根据您的需要采取相应措施。
答案 1 :(得分:5)
另一种更灵活的解决方案是设置要以只读模式呈现的字段的“禁用”属性,覆盖管理类的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
请注意,我的readonly字段名称不是来自通常的self.readonly_fields
,而是来自我命名为self.fake_readonly_fields
的其他数组,以避免名称重叠
建议的解决方案的限制(使用formfield_for_dbfield
)就是以这种方式呈现给定类型的所有数据库字段的相同方式,它应该是只读的还是不可读的。如果您的整个表单应该是只读的,那么这种方式很有效,但如果您处理的表单只有一半是只读而一半不是,那么最好依赖disabled
属性。
我在这里的答案的更多细节:django modeladmin, readonly_fields and boolean fields