My Django Modeladmin montre des formes différentes en dépendance sur les autorisations de l'utilisateur. J'ai résolu avec Modelform's (get_form, get_fieletsets), mais que faire avec les inlines? Modeladmin les initialise dans Modeladmin .__ init __ () Code> Avant d'obtenir la demande objet. La seule façon semble utiliser CSS pour les cacher. P> p>
4 Réponses :
voir la ligne 243 de django / contrib / admin / options.py p> modeladmin .__ init __ () code> prend les classes dans
modeladmin.inlines code>, les instancite et stocke les résultats dans
modeladmin.inline_instances code>. Vous pouvez définir
modeladmin.inline_instances code> sur une liste vide après
__ init __ code> pour supprimer les inlines. P>
J'ai essayé de définir le contexte ['inline_Instances'] = [] code> dans
rendu_change_form code>, mais il soulève une erreur de validation lors de l'enregistrement. (Django 1.3). Je vais essayer de définir
self.inline_instances = [] code> pour vider
HM .. Je considère que l'utilisation de CSS serait plus facile. Dans votre variante, je dois réinjecter des instances en ligne et les ajouter au contexte. Beaucoup de travail et copie-coller du code source Django
rendu_change_form code> semble être un mauvais choix pour ce type de logique. Vérifiez les autorisations de l'utilisateur dans quelque chose comme
Change_View CODE> et définir
auto.inline_instances code> de manière appropriée, et vous ne devriez pas avoir de problèmes.
Cela ne répond pas à la nécessité de filtrer les inlines en fonction des propriétés de l'utilisateur de la visualisation de Modeladmin. Ceci init b> n'a pas de référence à la demande et donc de la demande.user
J'ai résolu ceci en mettant la logique à définir Par exemple, si vous vouliez montrer les inlines aux superutilisateurs mais que personne d'autre: p> auto.inline_instances = [] code> dans le
get_readonly_fields (auto, demande, obj = aucun) code> méthode.
J'ai utilisé le truc de Bskinner pour masquer les inlines lors de l'ajout d'un nouvel objet, avec deux ajustements: premièrement, je devais écraser "Inlines", pas "inline_instances", et deuxièmement, assurez-vous de toujours retourner self.Readonly_fields pour vous assurer que Vous préservez ceux quand ils sont définis.
def get_readonly_fields(self, request, obj=None): if obj: # edit mode... add fields here to make them read-only when editing return self.readonly_fields else: self.inlines = [] return self.readonly_fields
Vous pouvez utiliser la fonction mannedmin get_inline_instances. Le code suivant supprime les inlines de Add_View:
from django.contrib import admin from models import FooModel class FooInline(admin.StackedInline): model = FooModel class MyModelAdmin(admin.ModelAdmin): inlines = [FooInline] def get_inline_instances(self, request, obj=None): return obj and super(MyModelAdmin, self).get_inline_instances(request, obj) or []
Je l'ai également utilisé pour supprimer toutes les inlines. Ensuite, je voulais supprimer des inlines, alors j'ai utilisé retour Super (mymodeladmin, auto) .get_inline_instances (demande, obj) [0: 3] code> pour obtenir les 3 premières inlines. On pourrait utiliser une autre manipulation de la liste pour obtenir différents sous-ensembles. Si quelqu'un peut me dire comment faire cela dans une façon de hack-hack hack way je l'apprécierais!