[PYTHON] Spécifiez dynamiquement le jeu de requêtes ModelChoiceField dans Django

introduction

Il existe un cas où vous souhaitez contrôler les éléments qui peuvent être sélectionnés en fonction de l'autorité de l'utilisateur connecté pour la zone de liste référencée par le maître.

↓ Un mémo expliquant comment enquêter et essayer d'utiliser le modèle et le formulaire comme échantillon.

models.py


class Book(models.Model):
    name = models.charField('name',max_length=255)

forms.py


class SampleForm(forms.Form):
    book = forms.ModelChoiceField(label='book',queryset=Book.objects.all())

Écraser le jeu de requêtes après la génération du formulaire

Probablement le moyen le plus simple.

python


form = SampleForm()
form.fields['book'].queryset = Book.objects.filter(...)

Recevoir le jeu de requêtes comme argument et le remplacer par __init__ du formulaire

forms.py


class SampleForm(forms.Form):
    book = forms.ModelChoiceField(label='book',queryset=Book.objects.none())
    def __init__(self, queryset=None, *args, **kwargs):
        super(SampleForm,self).__init__(*args,**kwargs)
        if queryset :
            self.fields['book'].queryset = queryset

python


form = SampleForm(queryset=Book.objects.filter(...))

Notez que self.fields ne sera généré que si vous appelez super .__ init__.

La procédure à suivre avec le jeu de requêtes par défaut dépend du rôle du formulaire.

Il est également possible d'implémenter que l'ensemble de requêtes lui-même n'est pas reçu, que seules les données utilisées pour la condition de filtre sont reçues et que l'ensemble de requêtes est généré côté formulaire.

forms.py


class SampleForm(forms.Form):
    book = forms.ModelChoiceField(label='book',queryset=Book.objects.none())
    def __init__(self, permission=None, *args, **kwargs):
        super(SampleForm,self).__init__(*args,**kwargs)
        self.fields['book'].queryset = self.get_book_list(permission)

    def get_book_list(self, permission=None):
        if not permission :
            return Book.objects.none()

        if permission == AAA :
            query = Q(...)
        elif permission == BBB :
            query = Q(...)
        #Écrivez autant que vous en avez besoin...

        return Book.objects.filter(query)

Ce que vous faites est essentiellement la même chose. Le fait est que vous pouvez remplacer Form.fields ['field_name']. Queryset après avoir traité Form .__ init__.

De côté

En jouant avec Form.fields, vous pouvez modifier divers attributs d'autres champs après la création du formulaire. Est-il possible d'ajouter / supprimer le champ lui-même?

Recommended Posts

Spécifiez dynamiquement le jeu de requêtes ModelChoiceField dans Django
Ajouter dynamiquement des champs de formulaire dans Django
Créer un bot LINE avec Django
Installer Django dans l'environnement virtuel pipenv
Implémenter un modèle utilisateur personnalisé dans Django
Ajouter dynamiquement des champs aux objets Form avec Django
Modèle dans Django
Démarrez Django dans un environnement virtuel à l'aide de Pipenv
Activez Django https en quelques lignes
Créez un environnement Django avec Vagrant en 5 minutes
Spécifiez l'URL de la vue dans le modèle Django
Configurer un module avec plusieurs fichiers dans Django
Comment créer une API Rest dans Django
Jusqu'à ce que vous créiez une nouvelle application dans Django
Formulaire à Django
Comment spécifier un schéma dans les paramètres de la base de données Django
Spécifiez une sous-commande comme argument de ligne de commande en Python
En Python, créez un décorateur qui accepte dynamiquement les arguments Créer un décorateur
Créez dynamiquement des tables dans un schéma avec Django, générez dynamiquement des modèles
Comment référencer des fichiers statiques dans un projet Django
Créer un planning Django
dict in dict Transforme un dict en dict
Démarrer un projet Django
Essayez d'exécuter python dans l'environnement Django créé avec pipenv
[Django] Gérez les paramètres comme l'écriture dans settings.py avec un modèle
Une histoire sur la façon de spécifier un chemin relatif en python.
Spécifiez la plage de dates avec l'opérateur de comparaison dans Python datetime
J'ai fait une commande pour générer un commentaire pour une table dans Django
Jusqu'à ce que Django retourne quelque chose avec un robot de ligne!
Meilleures pratiques pour la gestion dynamique des messages LINE Flex dans Django