Django Admin - Deaktivieren Sie die Aktion "Hinzufügen" für ein bestimmtes Modell


146

Ich habe eine Django-Seite mit vielen Modellen und Formen. Ich habe viele benutzerdefinierte Formulare und Formsets und Inlineformsets sowie benutzerdefinierte Validierungs- und benutzerdefinierte Abfragesätze. Daher hängt die Aktion "Modell hinzufügen" von Formularen ab, die andere Dinge benötigen, und das "Modell hinzufügen" im Django-Administrator durchläuft eine 500 aus einem benutzerdefinierten Abfragesatz.

Gibt es überhaupt eine Möglichkeit, die Funktion 'Add $ MODEL' für bestimmte Modelle zu deaktivieren?

Ich möchte /admin/appname/modelname/add/eine 404 (oder eine geeignete Fehlermeldung "Geh weg") geben. Ich möchte nicht, dass die Schaltfläche "$ MODELNAME hinzufügen" angezeigt wird /admin/appname/modelname.

Django admin bietet eine Möglichkeit zum Deaktivieren von Administratoraktionen (http://docs.djangoproject.com/de/dev/ref/contrib/admin/actions/#disabling-actions). Die einzige Aktion für dieses Modell ist jedoch "delete_selected". Das heißt, die Administratoraktionen wirken sich nur auf vorhandene Modelle aus. Gibt es eine django-artige Möglichkeit, dies zu tun?


Zu Ihrer Information: 'Aktionen' in Django Admin sind die Dropdown-Listen, die in der Änderungslistenansicht für alle markierten Zeilen in der Liste gelten.
Tim Diggins

1
Verwandte (aber andere) Frage: stackoverflow.com/questions/1721037/…
user9876

Antworten:


341

Es ist einfach, einfach die has_add_permissionMethode in Ihrer AdminKlasse so zu überladen :

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

7
Das hat bei mir nicht funktioniert. Die Schaltfläche "Modell hinzufügen" wird weiterhin auf der Änderungslistenseite des Modells angezeigt.
Cerin

Was ist MyAdmin hier?
user5319825

1
Vergessen Sie nicht, MyAdmin auch wie folgt zu registrieren: admin.site.register(MyModel, MyModelAdmin)Fügen Sie alles in den admin.pyApp-Ordner des Models ein.
Djangonaut

Und genau deshalb liebe ich Python & Django so sehr. Einfach. Hat super funktioniert. Danke dir!
dxhans5

2
Arbeitet bei Django 1.11. Keine Notwendigkeit für objParameter.
FJSJ

9

Standardmäßig erstellt syncdb 3 Sicherheitsberechtigungen für jedes Modell:

  1. Erstellen (aka hinzufügen)
  2. Veränderung
  3. Löschen

Wenn Sie als Administrator angemeldet sind, erhalten Sie ALLES, egal was passiert .

Wenn Sie jedoch eine neue Benutzergruppe mit dem Namen "Allgemeiner Zugriff" erstellen (z. B.) , können Sie NUR die Berechtigungen ÄNDERN und LÖSCHEN für alle Ihre Modelle zuweisen.

Dann hat jeder angemeldete Benutzer, der Mitglied dieser Gruppe ist, keine Berechtigung zum Erstellen. Es wird nichts damit verbundenes auf dem Bildschirm angezeigt.


7

Ich denke, das wird dir helfen. Der folgende Code muss sich in der Datei admin.py befinden

@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

Zusätzlich zu den oben genannten, wie von gepostet

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

Dies funktioniert mit 2.2. Außerdem werden die Schaltflächen zum Hinzufügen und Entfernen für Superuser entfernt. Genau das, was ich brauche.
Erik Kalkoken

2

Kopieren Sie einfach den Code aus einer anderen Antwort

# 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 meinem Fall verwende ich 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

in service = formset.form.base_fields['service'] base_fieldssind die im Modell definierten Felder

falls im Formular definiert, verwenden Sie:

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

siehe auch


Ja, base_fieldsund declared_fieldsdas ist das wichtigste Ergebnis, das ich aus diesem Fall gelernt habe.
CK

0

Dies ist eine zu viel verspätete Antwort. Posten Sie dies einfach so, als ob jemand die gleiche Lösung findet.

In der Datei admin.py können Sie Folgendes tun:

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)

Hier macht "readonly_fields" die Magie. Vielen Dank.


4
Dies verhindert nicht, dass die Schaltfläche "Hinzufügen" angezeigt wird.
Flimm

Diese Lösung macht einfach die Titel- und Gewichtsfelder im Formular deaktiviert. Dies würde die Erstellung eines neuen MyModelAdmin-Objekts nicht verhindern, nach dem das OP meines Erachtens gefragt hat.
dxhans5
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.