django admin如何在readonly字段上显示小部件

时间:2013-02-12 12:36:59

标签: django django-forms django-admin django-widget

我希望在字段为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不会使用我的表格)

即使在只读字段,如何才能使用表单?

如果我将字段设置为只读,如何显示另一个小部件?

2 个答案:

答案 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