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?

Rory
quelle
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
Frost.baka
quelle
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.

Richard Cooke
quelle
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
Sandeep Prasad Kushwaha
quelle
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

CK
quelle
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.

Mohammad
quelle
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