web-dev-qa-db-fra.com

Django Admin - Désactive l'action "Ajouter" pour un modèle spécifique

J'ai un site Django avec beaucoup de modèles et de formulaires. J'ai beaucoup de formulaires personnalisés et de jeux de formulaires et de formulaires en ligne, ainsi que de validation et de requêtes personnalisées. Par conséquent, l'action d'ajout de modèle dépend des formulaires qui nécessitent d'autres éléments, et le 'add model' dans Django admin passe par un 500 depuis un ensemble de requêtes personnalisé.

Est-il possible de désactiver la fonctionnalité "Ajouter un modèle" pour certains modèles?

Je voudrais /admin/appname/modelname/add/ pour donner un message d'erreur 404 (ou un message d'erreur approprié "Go away"), je ne souhaite pas que le bouton "Ajouter $ MODELNAME" soit activé /admin/appname/modelname vue.

Django admin fournit un moyen de désactiver les actions d’administrateur (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions), mais la seule action de ce modèle est 'delete_selected'. les actions de l'administrateur n'agissent que sur les modèles existants. Y a-t-il une manière Django-esque de faire cela?

137
Rory

C'est facile, il suffit de surcharger has_add_permission méthode dans votre classe Admin comme ceci:

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

Par défaut, syncdb crée 3 autorisations de sécurité pour chaque modèle:

  1. Créer (aka ajouter)
  2. Changement
  3. Supprimer

Si vous êtes connecté en tant qu'administrateur, vous obtenez TOUT quoi qu'il arrive.

Mais si vous créez un nouveau groupe d'utilisateurs appelé "Accès général" (par exemple ) vous pouvez attribuer UNIQUEMENT les autorisations CHANGE et DELETE à tous vos modèles.

Ensuite, tout utilisateur connecté qui est membre de ce groupe n'aura pas l'autorisation "Créer", rien de ce qui le concerne ne s'affichera à l'écran.

7
Richard Cooke

Je pense que cela vous aidera. Le code ci-dessous doit être dans le fichier 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

Copiez simplement le code d'une autre réponse

# 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

Dans mon cas, j'utilise 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

dans service = formset.form.base_fields['service']base_fields sont les champs définis dans le modèle

si défini dans le formulaire, utilisez:

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

voir aussi

0
C.K.

C'est une réponse trop tardive. Il suffit de poster ceci comme si quelqu'un trouvait la même solution.

Dans le fichier admin.py, vous pouvez effectuer les opérations suivantes:

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)

Ici, "readonly_fields" fait la magie. Merci.

0
Mohammad