Ich habe eine Django-Form, in der ein Auswahlfeld von db ausgefüllt wird.
class TestForm(forms.Form):
CLASS_CHOICE = []
classes = Class.objects.filter(std__gte=4)
for cls in classes:
CLASS_CHOICE.append((cls.code,
"{} - {}".format(cls.code,cls.std)))
name = forms.CharField()
class = forms.ChoiceField(choices = CLASS_CHOICE)
def _post_clean(self):
# some validation
pass
Beim Schreiben seines Unit-Tests als:
class SampleTest(TestCase):
@classmethod
def setUpClass(cls):
super(SampleTest, cls).setUpClass()
cls.class = Class.objects.create(std=10,code="A")
def test_valid_form(self):
post_data = {"name":"testing",
"class":"A" }
f = TestForm(data=post_data)
self.assertTrue(f.is_valid())
Das Problem ist nun, dass beim Ausführen des Tests die Anwendung zuerst geladen wird, bevor db initialisiert wird, daher die setUpClass
für Unit Test wird nicht aufgerufen und CLASS_CHOICE
bleibt leer und die Formularüberprüfung schlägt fehl. Wie kann ich dies vermeiden oder das Auswahlfeld neu initialisieren, nachdem ich einen Eintrag in erstellt habe? Class
Tabelle.
Antworten:
0 für die Antwort № 1Die Art und Weise, wie Sie die Klassenauswahl eingerichtet haben, wird nur einmal ausgefüllt, wenn das Modul, das Ihren Code enthält, zum ersten Mal ausgeführt wird. Dies ist weniger als ideal, weil:
- Wenn neue Klassen hinzugefügt werden, sind sie nicht als Auswahloptionen verfügbar
- Die Datenbank ist möglicherweise nicht verbunden, wenn dieses Modul in den Speicher geladen wird, was zu Laufzeitfehlern führt
Sie müssen es so machen, dass choices
wird jedes Mal dynamisch erstellt, wenn ein neues Formular erstellt wird. Um dies zu tun, machen choices
eine aufrufbare Funktion statt einer Liste:
def get_class_choices():
class_choice = []
classes = Class.objects.filter(std__gte=4)
for cls in classes:
class_choice.append((cls.code, "{} - {}".format(cls.code, cls.std)))
return class_choice
class TestForm(forms.Form):
name = forms.CharField()
class = forms.ChoiceField(choices=get_class_choices)
def _post_clean(self):
# some validation
pass