使用装饰器或Mixin将字段添加到'readonly_fields'和'fields'Djnago管理员的通用方法

时间:2019-03-29 15:29:08

标签: django django-admin

我想以某种通用方法将str附加到django admin的字段(“ fields”,“ readonly_fileds”)上,理想的方法是Mixin或装饰器?当我尝试某些方式时,我遇到了递归或错误。

我尝试过两种方法。

from django.contrib import admin

# Register your models here.


class DistributedAdminMixin():
    pass
    def __init__(self, *args, **kwargs):
        super(DistributedAdminMixin, self).__init__(*args, **kwargs)

        import pdb
        pdb.set_trace()

        readonly_fields = self.readonly_fields.copy()
        readonly_fields.extend(['id_to_str'])
        self.readonly_fields = readonly_fields

    def get_form(self, request, obj=None, **kwargs):
        import pdb
        pdb.set_trace()
        print(1)
        if 'fields' in kwargs:
            fields = kwargs.get('fields') + ('id_to_str', )
        else:
            fields = self.flatten_fieldsets(self.get_fieldsets(request, obj))

        super(DistributedAdminMixin, self).get_form(self, request, obj, **kwargs)

    def get_fields(self, request, obj=None):

        fields = super(DistributedAdminMixin, self).get_fields(request, obj)
        fields.append('id_to_str')

        readonly_fields = super(DistributedAdminMixin, self).get_readonly_fields(request, obj)
        # super(DistributedAdminMixin, self).readonly_fields = readonly_fields.append('id_to_str')

    #     return fields

def distributed_admin(wrapped):
    class WrappedClass(wrapped):

        def get_fields(self, request, obj=None):

            fields = WrappedClass.get_fields(request, obj)
            fields.append('id_to_str')

            return fields

    return WrappedClass

1 个答案:

答案 0 :(得分:0)

我想您想在多个管理员模型中使用它。这应该起作用:

class ExtraFieldMixin:
    def get_fields(self, request, obj=None):
        fields = list(super(ExtraFieldMixin, self).get_fields(request, obj))
        return fields + ['extra_field']

readonly_fields相同,但是您必须重写get_readonly_fields方法。

请记住,您需要在Django模型或称为extra_field的管理模型中使用属性或方法。您也可以在Mixin中使用它:

class ExtraFieldMixin:
    # Previous code
    def extra_field(self, obj):
        return str(obj.id)