将字段添加到'readonly fields'和'fields'的通用方法Django admin with decorator或Mixin

问题描述 投票:0回答:1

我想有一些通用的方法将str附加到字段('fields','readonly_fileds')到django admin,理想的方式是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
django django-admin
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.