[python] Django Admin-특정 모델에 대해 ‘추가’작업 비활성화

모델과 양식이 많은 장고 사이트가 있습니다. 많은 사용자 정의 양식 및 양식 세트와 인라인 양식 세트 및 사용자 정의 유효성 검사 및 사용자 정의 쿼리 세트가 있습니다. 따라서 모델 추가 작업은 다른 사항이 필요한 양식에 따라 다르며 django 관리자의 ‘모델 추가’는 사용자 지정 쿼리 집합에서 500을 통과합니다.

특정 모델에 대해 ‘Add $ MODEL’기능을 비활성화 할 수 있습니까?

내가 원하는 /admin/appname/modelname/add/에있을 수있는 404 (오류 메시지 ‘사라’또는 적합), 내가 원하지 않는 ‘$ MODELNAME 추가’버튼 줄 /admin/appname/modelname보기를.

Django admin은 관리자 작업 (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions)을 비활성화하는 방법을 제공하지만이 모델의 유일한 작업은 ‘delete_selected’입니다. 즉, 관리자 작업은 기존 모델에서만 작동합니다. 이 작업을 수행하는 장고 같은 방법이 있습니까?



답변

클래스 has_add_permission에서 오버로드 메소드는 다음 Admin과 같이 쉽습니다 .

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


답변

기본적으로 syncdb는 각 모델에 대해 3 가지 보안 권한을 만듭니다.

  1. 만들기 (일명 추가)
  2. 변화
  3. 지우다

관리자로 로그인하면 무엇이든지 모든 것을 얻을 수 있습니다.

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

그런 다음 해당 그룹의 구성원 인 로그인 한 사용자는 “만들기”권한을 갖지 않으며, 관련된 어떤 것도 화면에 표시되지 않습니다.


답변

나는 이것이 당신을 도울 것이라고 생각합니다. 아래 코드는 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

에 의해 게시 된 위의 additon에서

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


답변

다른 답변에서 코드를 복사하십시오.

# 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

in 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”는 마법을 수행합니다. 감사.


답변