데코레이터 또는 Mixin을 사용하여 'readonly_fields'및 'fields'Djnago 관리자에 필드를 추가하는 일반적인 방법

아르 템 두마 노프

장고 관리자에게 str을 필드 ( '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
Bertucho

여러 관리자 모델에서 이것을 사용하고 싶을 것 같습니다. 이것은 작동합니다.

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)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관