12
votes

Django admin: exclure le champ sur le formulaire de changement seulement

S'il y a un moyen de détecter si des informations dans un modèle sont ajoutées ou modifiées.

S'il y a peut-être que ces informations soient utilisées pour exclure les champs.

Un peu de pseudocode pour illustrer ce que je suis parler de. xxx

merci


0 commentaires

4 Réponses :


9
votes
class SubSectionAdmin(admin.ModelAdmin):
    # ...
    def change_view(self, request, object_id, extra_context=None):       
        self.exclude = ('field', )
        return super(SubSectionAdmin, self).change_view(request, object_id, extra_context)

3 commentaires

self.exclude = ("champ",)


Et si le champ est un champ personnalisé sous forme administrative?


Voir les réponses ci-dessous pour pourquoi cela est dangereux et non la voie à suivre. Les objets administrateurs sont des singletons afin de définir Self.Exclude modifie l'état du sous-sectionAdmin pour appels add_views ultérieurs.



17
votes

La réponse d'Orwellien rendra l'ensemble de la sous-sectionAdmin singleton changer sa propriété exclude.

Un moyen de s'assurer que les champs sont exclus à une base par requête consiste à faire quelque chose comme: p>

class SubSectionAdmin(admin.ModelAdmin):
    # ...
    def get_form(self, request, obj=None, **kwargs):
        """Override the get_form and extend the 'exclude' keyword arg"""
        if obj:
            kwargs.update({
                'exclude': getattr(kwargs, 'exclude', tuple()) + ('field',),
            })
        return super(SubSectionAdmin, self).get_form(request, obj, **kwargs)


0 commentaires

0
votes

L'approche ci-dessous présente l'avantage de ne pas remplacer l'objet large exclure code> propriété; Au lieu de cela, il est réinitialisé en fonction de chaque type de demande

class SubSectionAdmin(admin.ModelAdmin):
    add_exclude = ('field1', 'field2')
    edit_exclude = ('field2',)

    def add_view(self, *args, **kwargs):
        self.exclude = getattr(self, 'add_exclude', ())
        return super(SubSectionAdmin, self).add_view(*args, **kwargs)

    def change_view(self, *args, **kwargs):
        self.exclude = getattr(self, 'edit_exclude', ())
        return super(SubSectionAdmin, self).change_view(*args, **kwargs)


1 commentaires

Les classes Modeladmin sont des singletons, alors modifier leur état est problématique



10
votes

Réglage Self.Exclude code> AS @ Steve-Pike mentionne, rend l'ensemble de la sous-section code> Singleton modifier sa propriété exclude. Un singleton est une classe qui réutilisera le même exemple à chaque fois que la classe est instanciée, une instance n'est donc créée que sur la première utilisation du constructeur et l'utilisation ultérieure du constructeur renvoie la même instance. Voir le page wiki pour une description plus indispensable. Cela signifie que si vous écrivez du code pour exclure le champ sur Modification, cela aura l'implication que si vous ajoutez d'un article, le champ sera présent, mais si vous ouvrez un élément de modification, le champ sera exclu pour vos visites suivantes. à la page Ajouter.

Le moyen le plus simple d'atteindre un comportement par demande, est d'utiliser get_fields de code> et de tester sur l'argument code> obj code>, qui est Aucun Si nous ajoutons un objet et une instance d'un objet si nous changeons un objet. La méthode get_fields code> est disponible à partir de DJANGO 1.7. P>

from copy import deepcopy

class SubSectionAdmin(admin.ModelAdmin):
    def get_fieldsets(self, request, obj=None):
        """Custom override to exclude fields"""
        fieldsets = deepcopy(super(SubSectionAdmin, self).get_fieldsets(request, obj))

        # Append excludes here instead of using self.exclude.
        # When fieldsets are defined for the user admin, so self.exclude is ignored.
        exclude = ()

        if not request.user.is_superuser:
            exclude += ('accepted_error_margin_alert', 'accepted_error_margin_warning')

        # Iterate fieldsets
        for fieldset in fieldsets:
            fieldset_fields = fieldset[1]['fields']

            # Remove excluded fields from the fieldset
            for exclude_field in exclude:
                if exclude_field in fieldset_fields:
                    fieldset_fields = tuple(field for field in fieldset_fields if field != exclude_field)  # Filter
                    fieldset[1]['fields'] = fieldset_fields  # Store new tuple

        return fieldsets


0 commentaires