J'ai un site django avec beaucoup de modèles et de formulaires. J'ai de nombreux formulaires et ensembles de formulaires personnalisés et des ensembles de formulaires en ligne, ainsi que des ensembles de validation et de requêtes personnalisés. Par conséquent, l'action d'ajout de modèle dépend des formulaires qui ont besoin d'autres choses, et le 'modèle d'ajout' dans l'administrateur de django passe par un 500 à partir d'un ensemble de requêtes personnalisé.
Est-il possible de désactiver la fonctionnalité «Ajouter $ MODEL» pour certains modèles?
Je veux /admin/appname/modelname/add/
donner un 404 (ou un message d'erreur «go away» approprié), je ne veux pas que le bouton «Ajouter $ MODELNAME» soit affiché /admin/appname/modelname
.
L'administrateur de Django fournit un moyen de désactiver les actions d'administration (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions) mais la seule action pour ce modèle est «delete_selected». c'est-à-dire que les actions d'administration agissent uniquement sur les modèles existants. Y a-t-il une manière django-esque de faire cela?
Réponses:
C'est facile, il suffit de surcharger la
has_add_permission
méthode dans votreAdmin
classe comme ceci:la source
admin.site.register(MyModel, MyModelAdmin)
Ajouter tout dans leadmin.py
dossier de l'application des modèles.obj
paramètre.Par défaut, syncdb crée 3 autorisations de sécurité pour chaque modèle:
Si vous êtes connecté en tant qu'administrateur, vous obtenez TOUT , quoi .
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 pour tous vos modèles.
Ensuite, tout utilisateur connecté qui est membre de ce groupe n'aura pas l'autorisation "Créer", rien qui lui est lié ne s'affichera à l'écran.
la source
Je pense que cela vous aidera .. le code ci-dessous doit être dans le fichier admin.py
En plus de ce qui précède, publié par
la source
Copiez simplement le code d'une autre réponse
Dans mon cas, j'utilise en ligne
dans
service = formset.form.base_fields['service']
base_fields
est les champs définis dans le modèlesi défini dans le formulaire, utilisez:
product = formset.form.declared_fields['product']
voir également
la source
base_fields
etdeclared_fields
c'est la découverte la plus importante que j'ai tirée de cette affaire.C'est une réponse trop tardive; Publiez simplement ceci comme si quelqu'un trouvait la même solution.
Dans le fichier admin.py, vous pouvez effectuer les opérations suivantes:
Ici, "readonly_fields" fait la magie. Merci.
la source