Django Admin-특정 모델에 대해 '추가'작업 비활성화


147

모델과 양식이 많은 장고 사이트가 있습니다. 많은 사용자 정의 양식 및 양식 세트와 인라인 양식 세트 및 사용자 정의 유효성 검사 및 사용자 정의 쿼리 세트가 있습니다. 따라서 모델 추가 작업은 다른 사항이 필요한 양식에 따라 다르며 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'입니다. 즉, 관리자 작업은 기존 모델에서만 작동합니다. 이 작업을 수행하는 장고 같은 방법이 있습니까?


참고 : django admin의 'actions'는 변경 목록보기에서 목록의 선택된 행에 적용되는 드롭 다운입니다.
Tim Diggins

1
관련 (그러나 다른) 질문 : stackoverflow.com/questions/1721037/…
user9876

답변:


342

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

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

7
이것은 나를 위해 작동하지 않았습니다. "모델 추가"버튼은 여전히 ​​모델의 변경 목록 페이지에 표시됩니다.
Cerin

여기에 MyAdmin이 무엇입니까?
user5319825

1
다음과 같이 MyAdmin을 등록하는 것을 잊지 마십시오 : 모델의 앱 폴더에 admin.site.register(MyModel, MyModelAdmin)모두 추가하십시오 admin.py.
djangonaut

그리고 이것이 제가 Python & Django를 너무 좋아하는 이유입니다. 단순한. 잘 했어. 감사합니다!
dxhans5

2
장고 1.11에서 작동합니다. obj매개 변수 가 필요 없습니다 .
fjsj

9

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

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

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

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

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


7

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

이것은 2.2에서 작동합니다. 또한 수퍼 유저에 대한 추가 및 제거 버튼을 제거합니다. 정확히 내가 필요한 것.
Erik Kalkoken

2

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

# 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']

또한보십시오


예, base_fields하고 declared_fields나는이 사건에서 배운 가장 중요한 발견이다.
CK

0

너무 지연된 답변입니다. 누군가가 동일한 솔루션을 찾는 것처럼 이것을 게시하십시오.

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


4
"추가"단추가 나타나지 않습니다.
Flimm

이 솔루션은 양식에서 제목 및 무게 필드를 비활성화합니다. OP가 요구하는 것으로 생각되는 새로운 MyModelAdmin 객체를 만드는 것은 막을 수 없습니다.
dxhans5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.