복붙노트

[PYTHON] 장고 관리자 - 모든 필드를 읽기 전용으로 만들기

PYTHON

장고 관리자 - 모든 필드를 읽기 전용으로 만들기

모든 필드를 명시 적으로 명시하지 않고 읽기 전용으로 만들려고합니다.

같은 것 :

class CustomAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields

        return self.fields

문제는이 시점에서 CustomAdmin.fields가 설정되어 있지 않다는 것입니다.

어떤 아이디어?

해결법

  1. ==============================

    1.조심성있는, self.model._meta.fields는 반드시 CustomAdmin과 동일한 필드가 아닙니다!

    조심성있는, self.model._meta.fields는 반드시 CustomAdmin과 동일한 필드가 아닙니다!

    "관리자의 모든 분야"는 다음과 같이 보입니다.

    from django.contrib import admin
    from django.contrib.admin.utils import flatten_fieldsets
    
    class CustomAdmin(admin.ModelAdmin):
        def get_readonly_fields(self, request, obj=None):
            if request.user.is_superuser:
                return self.readonly_fields
    
            if self.declared_fieldsets:
                return flatten_fieldsets(self.declared_fieldsets)
            else:
                return list(set(
                    [field.name for field in self.opts.local_fields] +
                    [field.name for field in self.opts.local_many_to_many]
                ))
    
  2. ==============================

    2.좋아, 이제이게있다.

    좋아, 이제이게있다.

    class CustomAdmin(admin.ModelAdmin):
        def get_readonly_fields(self, request, obj=None):
            # ...
    
            return [f.name for f in self.model._meta.fields]
    

    아직도 덜 못생긴 방법을 찾고 있습니다.

  3. ==============================

    3.모델 메타 필드를 반복 할 수 있습니다.

    모델 메타 필드를 반복 할 수 있습니다.

    def get_readonly_fields(self, request, obj=None):
        if obj:
            self.readonly_fields = [field.name for field in obj.__class__._meta.fields]
        return self.readonly_fields
    
  4. ==============================

    4.인라인 (탭 또는 스택)

    인라인 (탭 또는 스택)

    def get_readonly_fields(self, request, obj=None):
        fields = []
        for field in self.model._meta.get_all_field_names():
            if field != 'id':
                fields.append(field)
        return fields
    
    def has_add_permission(self, request):
        return False
    
  5. ==============================

    5.이 장고 1.10 함께 나를 위해 일했다.

    이 장고 1.10 함께 나를 위해 일했다.

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields
    
        return list(set(
            [field.name for field in self.opts.local_fields] +
            [field.name for field in self.opts.local_many_to_many]
        ))
    
  6. ==============================

    6.나의 요구 사항은 비슷했다. 읽기 전용으로 표시하려면 하나의 입력란 만 있으면됩니다. 그리고 이것은 잘 작동했습니다 :

    나의 요구 사항은 비슷했다. 읽기 전용으로 표시하려면 하나의 입력란 만 있으면됩니다. 그리고 이것은 잘 작동했습니다 :

    class ChoiceInline(admin.TabularInline):
        model = Choice
        extra = 1
        fields = ['choice_text', 'votes']
        readonly_fields = ['votes']
    
    class QuestionAdmin(admin.ModelAdmin):
        #fields = ['pub_date', 'question_text']
        fieldsets = [
            (None, {'fields': ['question_text']}),
            ('Date Information', {'fields': ['pub_date']}),
        ]
        search_fields = ['question_text']
    
    
        inlines = [ChoiceInline]
    

    참조 : C : \ Python27 \ Lib \ site-packages \ django \ contrib \ admin \ options.py

  7. ==============================

    7.당신은 이것을 만들 수 있습니다 :

    당신은 이것을 만들 수 있습니다 :

    class CustomAdmin(admin.ModelAdmin):
        def has_change_permission(self, request, obj=None):
            return False
    
  8. ==============================

    8.get_fieldsets를 사용하면 폼의 모든 필드를 가져옵니다.

    get_fieldsets를 사용하면 폼의 모든 필드를 가져옵니다.

    def get_readonly_fields(self, request, obj=None):
        readonly = []
        for fs in self.get_fieldsets(request, obj):
            if len(fs) > 1:
                readonly += fs[1].get('fields', [])
        return readonly
    
  9. from https://stackoverflow.com/questions/13817525/django-admin-make-all-fields-readonly by cc-by-sa and MIT license