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

Fea*_*nor 8 django django-forms django-admin django-widget

当字段为readonly时,我想在django admin的字段上显示我的小部件.

admin.py

class AudioTrackAdminInline(admin.StackedInline):
    model = AudioTrack
    form = AudioTrackForm
    readonly_fields = ('file',)
Run Code Online (Sandbox Code Playgroud)

forms.py

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

当文件不是只读时,它会显示小部件确定.但当我把它作为readonly包含时,我看到文本行.(如果只读,Django不会使用我的表格)

即使在只读字段,我如何才能使用它?

要么

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

Łuk*_*asz 7

我会说这是一个功能.

当字段设置为readonly时,Django使用display_for_field硬编码结果的函数,你无法自定义它.

另一种方法是不将字段设置为只读和覆盖formfield_for_dbfield,这是一种未记录的ModelAdmin方法,并根据您的需要采取相应措施.


FSp*_*FSp 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
Run Code Online (Sandbox Code Playgroud)

请注意,我将readonly字段的名称不是通常的,self.readonly_fields而是来自我命名的不同数组,self.fake_readonly_fields以避免名称重叠

建议的解决方案(使用formfield_for_dbfield)的限制是,以这种方式,您以相同的方式呈现给定类型的所有数据库字段,它应该是只读的还是非读取的.如果您的整个表单应该是只读的,那么这种方式很有效,但如果您处理的表单只有一半是只读而一半不是,那么最好依赖于该disabled属性.

关于我的答案的更多细节:django modeladmin,readonly_fields和boolean fields