Django Admin: disabilita l'azione 'Aggiungi' per un modello specifico


147

Ho un sito django con molti modelli e forme. Ho molti moduli e set di moduli personalizzati e inlineformset e convalida personalizzati e queryset personalizzati. Quindi l'azione di aggiunta del modello dipende dai moduli che richiedono altre cose e il 'aggiungi modello' nell'amministratore di django passa attraverso un 500 da un queryset personalizzato.

Esiste un modo per disabilitare la funzionalità 'Aggiungi $ MODELLO' per alcuni modelli?

Voglio /admin/appname/modelname/add/dare un messaggio di errore 404 (o adatto "vai via"), non voglio che il pulsante "Aggiungi $ MODELNAME" sia /admin/appname/modelnamevisibile.

Django admin fornisce un modo per disabilitare le azioni dell'amministratore (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions) tuttavia l'unica azione per questo modello è 'delete_selected'. cioè le azioni dell'amministratore agiscono solo su modelli esistenti. C'è un modo django-esque per farlo?


Cordiali saluti: le "azioni" in django admin sono il menu a discesa che si applica nella vista dell'elenco modifiche a tutte le righe selezionate nell'elenco.
Tim Diggins,

1
Correlati (ma diversa) domanda: stackoverflow.com/questions/1721037/...
user9876

Risposte:


342

È facile, basta sovraccaricare il has_add_permissionmetodo nella tua Adminclasse in questo modo:

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

7
Questo non ha funzionato per me. Il pulsante "Aggiungi modello" viene ancora visualizzato nella pagina Elenco modifiche del modello.
Cerin,

che cos'è MyAdmin qui?
user5319825,

1
Non dimenticare di registrare anche MyAdmin come: admin.site.register(MyModel, MyModelAdmin)Aggiungi tutto nella admin.pycartella dell'app dei modelli.
Djangonaut il

E questo è esattamente il motivo per cui adoro Python e Django. Semplice. Ha funzionato alla grande. Grazie!
dxhans5,

2
Funziona a Django 1.11. Non è necessario alcun objparametro.
fjsj,

9

Per impostazione predefinita syncdb crea 3 autorizzazioni di sicurezza per ciascun modello:

  1. Crea (aka aggiunto)
  2. Modificare
  3. Elimina

Se hai effettuato l'accesso come amministratore, otterrai TUTTO, qualunque cosa accada .

Ma se crei un nuovo gruppo di utenti chiamato "Accesso generale" (ad esempio) , puoi assegnare SOLO le autorizzazioni MODIFICA e ELIMINA per tutti i tuoi modelli.

Quindi qualsiasi utente connesso che è membro di quel gruppo non avrà l'autorizzazione "Crea", sullo schermo non verrà mostrato nulla ad esso correlato.


7

Penso che questo ti aiuterà .. sotto il codice deve essere nel file 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

In aggiunta a quanto sopra, come pubblicato da

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

Funziona con 2.2. e rimuoverà anche i pulsanti Aggiungi e Rimuovi per i superutenti. Esattamente quello di cui ho bisogno.
Erik Kalkoken,

2

Basta copiare il codice da un'altra risposta

# 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

Nel mio caso uso in linea

# 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è i campi definiti nel modello

se definito nel modulo utilizzare:

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

Guarda anche


Sì, base_fieldse declared_fieldssono la scoperta più importante che ho imparato da questo caso.
CK,

0

Questa è una risposta troppo ritardata; Pubblicando questo come se qualcuno stesse trovando la stessa soluzione.

Nel file admin.py puoi fare quanto segue:

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)

Qui "readonly_fields" fa la magia. Grazie.


4
Ciò non impedisce la visualizzazione del pulsante "Aggiungi".
Flimm,

Questa soluzione renderà semplicemente disabilitati i campi del titolo e del peso nel modulo. Non impedirebbe la creazione di un nuovo oggetto MyModelAdmin, il che è ciò che ritengo fosse richiesto dall'OP.
dxhans5,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.