Общий способ добавить поле в «readonly_fields» и и «fields» Djnago admin с декоратором или Mixin - PullRequest
0 голосов
/ 29 марта 2019

Я хочу иметь какой-то общий способ добавления str к полям ('fields', 'readonly_fileds') к администратору django, идеальный способ - 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 голосов
/ 29 марта 2019

Полагаю, вы хотите использовать это в нескольких моделях администраторов. Это должно работать:

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)
...