[PYTHON] Geben Sie das ModelChoiceField-Abfrageset in Django dynamisch an

Einführung

In einem Fall möchten Sie die Elemente steuern, die gemäß der Berechtigung des angemeldeten Benutzers für das Listenfeld ausgewählt werden können, auf das der Master verweist.

↓ Ein Memo darüber, wie Sie das Modell und das Formular als Beispiel untersuchen und versuchen können.

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())

Queryset nach Formularerstellung überschreiben

Wahrscheinlich der einfachste Weg.

python


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

Empfangen Sie das Abfrageset als Argument und überschreiben Sie es mit "init" des Formulars

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(...))

Beachten Sie, dass "self.fields" nur generiert wird, wenn Sie "super .__ init__" aufrufen.

Was Sie mit dem Standard-Abfragesatz tun, hängt von der Rolle des Formulars ab.

Es ist auch möglich zu implementieren, dass das Abfrageset selbst nicht empfangen wird, nur die für die Filterbedingung verwendeten Daten empfangen werden und das Abfrageset auf der Formularseite generiert wird.

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(...)
        #Schreiben Sie so viel, wie Sie brauchen...

        return Book.objects.filter(query)

Was Sie tun, ist im Wesentlichen dasselbe. Der Punkt ist, dass Sie Form.fields ['field_name']. Queryset nach der Verarbeitung von Form .__ init__ überschreiben können.

Beiseite

Durch Spielen mit "Form.fields" können Sie verschiedene Attribute anderer Felder ändern, nachdem das Formular erstellt wurde. Ist es möglich, das Feld selbst hinzuzufügen / zu entfernen?

Recommended Posts

Geben Sie das ModelChoiceField-Abfrageset in Django dynamisch an
Fügen Sie in Django dynamisch Formularfelder hinzu
Erstellen Sie mit Django einen LINE-Bot
Installieren Sie Django in einer virtuellen Pipenv-Umgebung
Implementieren Sie ein benutzerdefiniertes Benutzermodell in Django
Fügen Sie Formularobjekten mit Django dynamisch Felder hinzu
Modell in Django
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Aktivieren Sie Django https in nur wenigen Zeilen
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Geben Sie die Ansichts-URL in der Django-Vorlage an
Konfigurieren Sie ein Modul mit mehreren Dateien in Django
So erstellen Sie eine Rest-API in Django
Bis Sie eine neue App in Django erstellen
Form in Django
So legen Sie das Schema in den Django-Datenbankeinstellungen fest
Geben Sie in Python einen Unterbefehl als Befehlszeilenargument an
Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator
Erstellen Sie mit Django dynamisch Tabellen im Schema und generieren Sie dynamisch Modelle
So verweisen Sie auf statische Dateien in einem Django-Projekt
Erstellen Sie einen Django-Zeitplan
diktieren in diktieren Macht ein Diktat ein Diktat
Starten Sie ein Django-Projekt
Versuchen Sie, Python in der mit pipenv erstellten Django-Umgebung auszuführen
[Django] Verwalten Sie Einstellungen wie das Schreiben in settings.py mit einem Modell
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Geben Sie den Datumsbereich mit dem Vergleichsoperator in Python datetime an
Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Bis Django etwas mit einem Linienbot zurückgibt!
Best Practices für die dynamische Verarbeitung von LINE Flex-Nachrichten in Django