source

장고 관리자 - 특정 모델에 대해 '추가' 작업을 사용하지 않습니다.

factcode 2023. 6. 18. 16:21
반응형

장고 관리자 - 특정 모델에 대해 '추가' 작업을 사용하지 않습니다.

저는 모델과 형태가 많은 장고 사이트를 가지고 있습니다.많은 사용자 정의 양식 및 양식 세트와 인라인 양식 세트, 사용자 정의 검증 및 사용자 정의 쿼리 세트를 보유하고 있습니다.따라서 모델 추가 작업은 다른 작업이 필요한 양식에 따라 달라지며, django 관리자의 '모델 추가'는 사용자 지정 쿼리 세트에서 500을 통과합니다.

특정 모델에 대해 '$MODEL 추가' 기능을 비활성화할 수 있는 방법이 있습니까?

나는 되고 싶다./admin/appname/modelname/add/404(또는 적절한 '이동' 오류 메시지)를 표시하려면 'Add $MODELNAME' 버튼을 켜지 마십시오./admin/appname/modelname보다.

Django admin은 관리 작업(http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/ #discovery-disable)을 사용하지 않도록 설정하는 방법을 제공하지만 이 모델에 대한 유일한 작업은 'delete_selected'입니다. 즉, 관리 작업은 기존 모델에만 적용됩니다.이것을 할 수 있는 장고풍의 방법이 있습니까?

그것은 쉽습니다, 단지 과부하입니다.has_add_permission의 메소드Admin이와 같은 클래스:

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False

이것이 당신에게 도움이 될 것 같습니다.아래 코드는 admin.py 파일에 있어야 합니다.

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', )
    list_filter = ('name', )
    search_fields = ('name', )
    list_per_page = 20

    # This will help you to disbale add functionality
    def has_add_permission(self, request):
        return False

    # This will help you to disable delete functionaliyt
    def has_delete_permission(self, request, obj=None):
        return False

게시한 바와 같이 위에 추가로

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False

기본적으로 syncdb는 각 모델에 대해 3개의 보안 권한을 생성합니다.

  1. 만들기(일명 추가)
  2. 바꾸다
  3. 삭제

관리자로 로그인하면 어떤 일이 있어도 모든 것을 얻을 수 있습니다.

그러나 "일반 액세스"라는 새 사용자 그룹을 만드는 경우(예: 모든 모델에 대해 변경 및 삭제 권한만 할당할 수 있습니다.

그러면 해당 그룹의 구성원인 로그인한 사용자는 "만들기" 권한이 없으며, 관련된 내용은 화면에 표시되지 않습니다.

다른 답변에서 코드를 복사하기만 하면 됩니다.

# In admin
# make the related field can't be added
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['service'].widget.can_add_related = False
        return form

저의 경우 인라인을 사용합니다.

# In inline formset e.g. admin.TabularInline
# disable all
    def get_formset(self, request, obj=None, **kwargs):
        formset = super().get_formset(request, obj, **kwargs)
        service = formset.form.base_fields['service']
        service.widget.can_add_related = service.widget.can_change_related = service.widget.can_delete_related = False
        return formset

service = formset.form.base_fields['service'] base_fields모델에 정의된 필드입니다.

형식에 정의된 경우 다음을 사용합니다.

product = formset.form.declared_fields['product']

참고 항목

이것은 너무 지연된 답변입니다. 동일한 해결책을 찾는 사람이 있는 것처럼 게시하는 것입니다.

admin.py 파일에서 다음을 수행할 수 있습니다.

class MyModelForm(forms.ModelForm):

class Meta:
    model = MyModel
    fields = '__all__'


class MyModelAdmin(admin.ModelAdmin):
    form = QuestionTrackAdminForm
    list_display = ['title', 'weight']
    readonly_fields = ['title', 'weight']

admin.site.register(MyModel, MyModelAdmin)

여기서 "readonly_fields"는 마법을 수행합니다.감사해요.

언급URL : https://stackoverflow.com/questions/4143886/django-admin-disable-the-add-action-for-a-specific-model

반응형