2016-05-23 9 views
0

Ich habe der folgende Test ...Django testen eine Form gilt, wenn es eine ModelChoiceField enthält

def test_contact_form(self): 
    form_data = {'name': 'Reiss Johnson', 
       'email': '[email protected]', 
       '_type': 'General Enquiry', 
       'content': 'This is some content'} 
    form = ContactForm(data=form_data) 
    self.assertTrue(form.is_valid()) 

Diese ursprünglich vorging als ‚_type‘ war ein CharField, aber es ist jetzt ein ModelChoiceField & so tut Weiß jemand, warum das scheitert? Ich rate jetzt, den '_type' falsch in das Wörterbuch einzugeben?

Wie kann ich den obigen Test wiederholen?

Meine Form ist wie so ...

class ContactForm(forms.Form): 
     name = forms.CharField(max_length=50) 
     email = forms.EmailField() 
     content = forms.CharField() 
     _type = forms.ModelChoiceField(queryset=EnquiryType.objects.values_list('text', flat=True), empty_label=None) 
+0

Was die Werte für 'EnquiryType' sind? 'GeneralEquiry' ist möglicherweise keine gültige Auswahl, dh es entspricht keinem der Werte für das Abfrage-Set. –

+0

Momentan habe ich 2 'EnquiryType' Objekte, eines hat ein' .text' Attribut von 'General Inquiry' und das andere hat ein 'Request A Call Back' '.text' Attribut. Muss ich das Attribut oder etwas eingeben? –

Antwort

0

Ich denke, das Problem ist, dass Sie nicht verstehen, was macht ModelChoiceField tun. Es würde eine Liste von id (was der Primärschlüssel für dieses Modell ist) generieren, die jedem Objekt entspricht, das das Modell hat. Wenn Sie also speichern, speichert es den id als Fremdschlüssel. Sie können das Formularfeld nicht mit einer text, die nur ein Feld des Modells EnquiryType ist, füttern. Denken Sie darüber nach, wenn Sie nicht auf den Primärschlüssel einer anderen Tabelle als .text verweisen, welches Objekt sollte die ModelChoiceField auswählen? Was, wenn Sie ein anderes Objekt erstellen, das dieselbe text hat?

Die einfache Lösung würde Ihre Testdaten mit der id des Objekts ändern, das General Enquiry als .text hat.

0

Ich hatte das gleiche Problem. Um auf Shang's Antwort zu erweitern:

Ja, es sieht aus wie die Verwendung des Primärschlüssels des Modells, auf das Sie verweisen, funktioniert.

Hier ist, was ich getan habe:

valid_pk = NameOfModel.objects.all()[0].pk 
# You may need to replace 0 with the right number. 
form_data = {'name': 'Reiss Johnson', 
      'email': '[email protected]', 
      '_type': str(valid_pk), 
      'content': 'This is some content'}