7
votes

Masquer le formulaire Inline à Django

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? XXX

Modeladmin les initialise dans Modeladmin .__ init __ () Avant d'obtenir la demande objet. La seule façon semble utiliser CSS pour les cacher.


0 commentaires

4 Réponses :


2
votes

modeladmin .__ init __ () prend les classes dans modeladmin.inlines , les instancite et stocke les résultats dans modeladmin.inline_instances . Vous pouvez définir modeladmin.inline_instances sur une liste vide après __ init __ pour supprimer les inlines.

voir la ligne 243 de django / contrib / admin / options.py


4 commentaires

J'ai essayé de définir le contexte ['inline_Instances'] = [] dans rendu_change_form , mais il soulève une erreur de validation lors de l'enregistrement. (Django 1.3). Je vais essayer de définir self.inline_instances = [] 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 semble être un mauvais choix pour ce type de logique. Vérifiez les autorisations de l'utilisateur dans quelque chose comme Change_View et définir auto.inline_instances 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 n'a pas de référence à la demande et donc de la demande.user



1
votes

J'ai résolu ceci en mettant la logique à définir auto.inline_instances = [] dans le get_readonly_fields (auto, demande, obj = aucun) méthode.

Par exemple, si vous vouliez montrer les inlines aux superutilisateurs mais que personne d'autre: xxx


0 commentaires

0
votes

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


0 commentaires

9
votes

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 []


1 commentaires

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] 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!