Django 如何将modeladmin额外表单字段添加到只读字段?

Django 如何将modeladmin额外表单字段添加到只读字段?,django,admin,Django,Admin,在ModelAdmin的readonly\u字段中添加额外的表单字段时,打开模型实例的管理页面时,出现配置不正确的错误: TaskClosedAdmin.readonly_fields[0], 'extra_admin_field' is not a callable or an attribute of 'TaskClosedAdmin' or found in the model 'TaskClosed'. 如何将额外字段添加到只读字段 编辑 我还尝试了TaskClosedAdmin的ge

ModelAdmin
readonly\u字段中添加额外的表单字段时,打开模型实例的管理页面时,出现
配置不正确的错误:

TaskClosedAdmin.readonly_fields[0], 'extra_admin_field' is not a callable or an attribute of 'TaskClosedAdmin' or found in the model 'TaskClosed'.
如何将额外字段添加到只读字段

编辑

我还尝试了
TaskClosedAdmin
get_form()
,认为字段可能会在
super(TaskClosedAdmin,self)之后更新。get_form(request,obj,**kwargs)

我仍然会收到关于
extra\u admin\u字段
不存在的相同错误。。。我在哪里可以添加它

models.py

管理员


您需要做的是编写一个只读小部件,并直接在表单上指定它,如下所示:

from ... import ReadOnlyWidget

class TaskForm(forms.ModelForm):
    extra_admin_field = forms.CharField(max_length=10)

    class Meta:
        model = Task
        widgets = {
            'extra_admin_field': ReadOnlyWidget,
        }

    def __init__(self, *args, **kwargs):
        super(TaskForm, self).__init__(*args, **kwargs)
        # set extra_admin_field value

这里有一个只读小部件应该可以工作(我还没有尝试过):

因为ModelAdmin有一个readonly_fields属性,我想Django中已经存在类似的东西了。我只想将我的额外字段添加到此只读字段。好的,你说得对,额外的管理员字段是表单字段,而不是模型字段,因此我无法将其添加到模型管理员只读字段。
class Task(models.Model):

    # some fields


class TaskToConfirm(Task):
    class Meta:
        proxy = True
class TaskForm(forms.ModelForm):

    extra_admin_field = forms.CharField(max_length=10)

    class Meta:
        model = Task


    def __init__(self, *args, **kwargs):

        super(TaskForm, self).__init__(*args, **kwargs)

        # set extra_admin_field value


class TaskAdmin(admin.ModelAdmin):

    form = TaskForm


class TaskClosedAdmin(TaskAdmin):

     readonly_fields = ('extra_admin_field',)
from ... import ReadOnlyWidget

class TaskForm(forms.ModelForm):
    extra_admin_field = forms.CharField(max_length=10)

    class Meta:
        model = Task
        widgets = {
            'extra_admin_field': ReadOnlyWidget,
        }

    def __init__(self, *args, **kwargs):
        super(TaskForm, self).__init__(*args, **kwargs)
        # set extra_admin_field value