Django Admin - Wyłącz akcję „Dodaj” dla określonego modelu

147

Mam witrynę django z wieloma modelami i formularzami. Mam wiele niestandardowych formularzy i zestawów formularzy oraz zestawów formularzy inline i niestandardowych walidacji i niestandardowych zestawów zapytań. Dlatego akcja dodawania modelu zależy od formularzy, które wymagają innych rzeczy, a „dodaj model” w panelu administracyjnym django za pośrednictwem 500 z niestandardowego zestawu zapytań.

Czy mimo wszystko można wyłączyć funkcję „Dodaj $ MODEL” dla niektórych modeli?

Chcę /admin/appname/modelname/add/podać kod 404 (lub odpowiedni komunikat o błędzie „odejdź”), nie chcę, aby przycisk „Dodaj $ MODELNAME” był /admin/appname/modelnamewidoczny.

Administrator Django zapewnia sposób na wyłączenie działań administratora (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disecting-actions), jednak jedyną akcją dla tego modelu jest „delete_selected”. tj. działania administracyjne działają tylko na istniejących modelach. Czy jest na to sposób w stylu django?

Rory
źródło
FYI: 'akcje' w django admin to rozwijane menu, które ma zastosowanie w widoku listy zmian do wszystkich zaznaczonych wierszy na liście.
Tim Diggins
1
Powiązane (ale inne) pytanie: stackoverflow.com/questions/1721037/…
user9876

Odpowiedzi:

342

To proste, po prostu przeładuj has_add_permissionmetodę w swojej Adminklasie w następujący sposób:

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False
Frost.baka
źródło
7
To nie zadziałało dla mnie. Przycisk „Dodaj model” nadal jest widoczny na stronie listy zmian modelu.
Cerin,
co to jest MyAdmin?
user5319825
1
Nie zapomnij również zarejestrować MyAdmin, jak: admin.site.register(MyModel, MyModelAdmin)Dodaj wszystko do admin.pyfolderu aplikacji modeli.
djangonaut
I właśnie dlatego tak bardzo kocham Pythona i Django. Prosty. Działało świetnie. Dziękuję Ci!
dxhans5
2
Działa w Django 1.11. Nie ma potrzeby objpodawania parametrów.
fjsj
9

Domyślnie syncdb tworzy 3 uprawnienia bezpieczeństwa dla każdego modelu:

  1. Utwórz (inaczej dodaj)
  2. Zmiana
  3. Usunąć

Jeśli jesteś zalogowany jako Administrator, otrzymasz WSZYSTKO bez względu na wszystko.

Ale jeśli utworzysz nową grupę użytkowników o nazwie „Dostęp ogólny” (na przykład) , możesz przypisać TYLKO uprawnienia ZMIANA i USUŃ wszystkim swoim modelom.

Wtedy każdy zalogowany użytkownik będący członkiem tej grupy nie będzie miał uprawnienia „Utwórz”, nic związanego z nim nie będzie wyświetlane na ekranie.

Richard Cooke
źródło
7

Myślę, że to ci pomoże ... poniższy kod musi być w pliku 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

Oprócz powyższego opublikowanego przez

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False
Sandeep Prasad Kushwaha
źródło
Działa to z 2.2. a także usunie przyciski dodawania i usuwania dla superużytkowników. Dokładnie to, czego potrzebuję.
Erik Kalkoken
2

Po prostu skopiuj kod z innej odpowiedzi

# 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

W moim przypadku używam inline

# 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

w service = formset.form.base_fields['service'] base_fieldsto pola zdefiniowane w modelu

jeśli zdefiniowano w formularzu, użyj:

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

Zobacz też

CK
źródło
Tak, base_fieldsi declared_fieldssą najważniejszym odkryciem, jakiego nauczyłem się w tej sprawie.
CK
0

To jest zbyt opóźniona odpowiedź; Po prostu opublikuj to tak, jakby ktoś szukał tego samego rozwiązania.

W pliku admin.py możesz wykonać następujące czynności:

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)

Tutaj „readonly_fields” robi magię. Dzięki.

Mohammad
źródło
4
Nie zapobiega to pojawianiu się przycisku „dodaj”.
Flimm
To rozwiązanie spowoduje po prostu wyłączenie pól tytułu i wagi w formularzu. Nie przeszkodziłoby to w utworzeniu nowego obiektu MyModelAdmin, o co, jak sądzę, prosił OP.
dxhans5