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!