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())
Wahrscheinlich der einfachste Weg.
python
form = SampleForm()
form.fields['book'].queryset = Book.objects.filter(...)
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.
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