django-forms fields - Erstellen Sie in Django-Formularfeldern standardmäßig ein leeres Abfrage-Set




view hidden (3)

Ich habe diese Felder in Form:

city = forms.ModelChoiceField(label="city", queryset=MyCity.objects.all())
district = forms.ModelChoiceField(label="district", queryset=MyDistrict.objects.all())
area = forms.ModelChoiceField(label="area", queryset=MyArea.objects.all())

Bezirk kommt von Klick auf Stadt und Bereich kommt aus Klick auf Bereich. Mit dem queryset=MyDistrict.objects.all() und queryset=MyArea.objects.all() wird es sehr schwer. Wie kann ich Abfragesätze standardmäßig leer lassen?

Danke im Voraus


Answers

@ radteks comment sollte eine Antwort sein, da es in ähnlichen Szenarien nützlich ist, aber mit einem anderen Ansatz als der akzeptierten Antwort.

Wenn sich Ihr Abfrage-Set mit der URL in Ihrer Sicht ändert

Ich erweitere die Antwort mit einem Beispiel wie ich es benutzt habe:

def my_view(request):
    ...
    form = YourForm(initial={'field1':value1, 'field2':value2})
    form.fields['field3'].queryset = YourModel.objects.filter('foo'=bar)

Sie können eine leere Abfrage erstellen, indem Sie Folgendes tun:

MyModel.objects.none()

Obwohl ich nicht weiß, wie Sie dieses Formular verwenden werden, können Sie das als das Abfrage-Set Ihres Feldes setzen, um zu bekommen, was Sie brauchen ...

Mehr Informationen finden Sie here


Erstens, wenn Sie nicht möchten, dass der Benutzer die Daten ändert, dann scheint es sauberer zu sein, das Feld einfach auszuschließen. Wenn Sie es als verstecktes Feld hinzufügen, werden einfach mehr Daten hinzugefügt, die über den Draht gesendet werden, und ein böswilliger Benutzer wird aufgefordert, es zu ändern, wenn Sie es nicht möchten. Wenn Sie einen guten Grund haben, das Feld einzuschließen, es jedoch zu verbergen, können Sie ein Schlüsselwort arg an den Konstruktor der Modellform übergeben. So etwas vielleicht:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def __init__(self, *args, **kwargs):
        from django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(MyModelForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['fieldname'].widget = HiddenInput()
            # or alternately:  del self.fields['fieldname']  to remove it from the form altogether.

Dann Ihrer Meinung nach:

form = MyModelForm(hide_condition=True)

Ich bevorzuge diesen Ansatz, um die Interna der Modellform in der Ansicht zu modifizieren, aber es ist Geschmackssache.





django django-forms