11

当字段为只读时,我想在 django admin 的字段上显示我的小部件。

管理员.py

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

表格.py

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

当文件不是只读文件时,它会显示小部件 OK。但是当我将它包含为只读时,我会看到文本行。(如果只读,Django 不会使用我的表单)

即使在只读字段中,我怎样才能让它使用表单?

或者

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

4

2 回答 2

9

我会说这是一个功能。

当字段设置为只读时,Django 使用display_for_field硬编码结果的函数,您无法自定义它。

另一种方法是不将该字段设置为 readonly 和 override formfield_for_dbfield,这是一种未记录的ModelAdmin方法,并根据您的需要采取行动。

于 2013-02-12T13:24:50.743 回答
8

另一种更灵活的解决方案是设置要以只读模式呈现的那些字段的“禁用”属性,覆盖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 and boolean fields

于 2014-03-28T14:11:34.810 回答