2009-05-01 10 views
85

Ich versuche, das Feld auf einen bestimmten Wert festzulegen, nachdem das Formular initialisiert wurde.Django Feldwert festlegen, nachdem ein Formular initialisiert wurde

Zum Beispiel habe ich die folgende Klasse.

class CustomForm(forms.Form): 
    Email = forms.EmailField(min_length=1, max_length=200) 

In der Ansicht, möchte ich in der Lage sein, so etwas zu tun:

form = CustomForm() 
form["Email"] = GetEmailString() 

return HttpResponse(t.render(c)) 

Antwort

105

Da Sie in POST-Daten nicht vorbei, werde ich davon ausgehen, dass, was Sie zu tun versuchen ist ein Anfangswert, der im Formular angezeigt wird. Die Art, wie Sie dies tun, ist mit dem Schlüsselwort initial.

form = CustomForm(initial={'Email': GetEmailString()}) 

Weitere Informationen finden Sie unter Django Form docs.

if form.is_valid(): 
    form.cleaned_data['Email'] = GetEmailString() 

Überprüfen Sie die referenzierte Dokumente oben Weitere Einzelheiten zur Verwendung cleaned_data

+0

Das ist genau das, was ich tun möchte. Vielen Dank! – Eldila

+0

Danke, für mich auch genau das, was ich brauchte .. – Neo

+1

Dies bestätigt, was ich wusste, aber mein 'ModelChoiceField' gibt immer noch invalid_choice, wenn ich ihm einen" initial "Wert gebe :( –

-12

Ein anderer Weg, dies zu tun:

Wenn Sie versuchen, einen Wert zu ändern, nachdem das Formular abgeschickt wurde, können Sie so etwas wie verwenden wenn Sie bereits ein Formular initialisiert (mit oder ohne Daten), und Sie müssen weitere Daten hinzufügen, bevor es angezeigt wird:

form.data['Email] = GetEmailString() 
+8

Das scheitert für mich. Ich habe eine Zeile wie die obige in der Methode __init__, und es wird ausgelöst "AttributeError: Diese QueryDict-Instanz ist unveränderlich" –

+0

Dieser Code funktioniert nur, wenn das Formular initiia wurde ohne Formulardaten. Daher wird ein unveränderliches Objekt wie request.GET oder request.POST nicht gebunden. Sie erhalten also ein leeres Wörterbuch (form.data), das ohne Fehler geändert werden kann. FYI Ich benutze Django 1.6.3 – potar

+0

Dies funktioniert, wenn Ihr "Content-Type" Header auf "multipart/form-data" gesetzt ist.Es schlägt fehl, wenn Sie den Inhaltstyp "application/x-www-form-urlencoded" verwenden. Ich weiß nicht warum, aber es war ein Fehler zu debuggen. – teewuane

74

wenn haben Sie bereits initiali Zed das Formular, können Sie die ursprüngliche Eigenschaft des Feldes verwenden. Zum Beispiel

form = CustomForm() 
form.fields["Email"].initial = GetEmailString() 
+10

Danke. Während die angenommene Antwort der vorgeschlagene Weg ist, gewinnen Sie den "tatsächlich beantworteten die Frage" Preis. Das ist, was ich gesucht habe (und was bei Google auftaucht). – jason

+0

Auch funktioniert gut in einer for-Schleife mit einem Formularsatz, verwenden Sie einfach die Logik "für Formular in Formset" und Sie können Auswahlmöglichkeiten und Anfangsdaten wie oben gezeigt festlegen. – radtek

+5

Gibt es eine andere Möglichkeit, dies zu tun, ist Django 1.7/Python 3.4? Dies funktioniert nicht für mich – Jeremy

5

So etwas wie Nigel Cohens funktionieren würde, wenn Sie Daten in eine Kopie Zugabe wurden der gesammelten Menge von Formulardaten:

form = FormType(request.POST) 
if request.method == "POST": 
    formcopy = form(request.POST.copy()) 
    formcopy.data['Email'] = GetEmailString() 
+1

Ich bin kein großer Fan davon, die Rohdaten zu überschreiben. Wenn Sie dies unbedingt tun müssen, sollten Sie 'data [form.add_prefix ('Email')]' verwenden, um Fälle zu berücksichtigen, in denen ein Präfix gesetzt ist. – Josh

+2

Gibt es eine andere Möglichkeit, dies zu tun, ist Django 1.7/Python 3.4? Dies funktioniert nicht für mich – Jeremy

+0

Die dritte Zeile kann ein wenig kürzer sein, wenn keine ursprüngliche Form beibehalten werden muss: 'form.data = form.data.copy()' – ZZY

6

Wenn Sie es innerhalb des Formulars tun wollen __init__ Verfahren aus irgendeinem Grund, können Sie die initial dict manipulieren:

class MyForm(forms.Form): 
    my_field = forms.CharField(max_length=255) 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.initial['my_field'] = 'Initial value' 
0

einfach Ihre Form.data Feld ändern:

class ChooseProjectForm(forms.Form): 
    project = forms.ModelChoiceField(queryset=project_qs) 
    my_projects = forms.BooleanField() 

    def __init__(self, *args, **kwargs): 
     super(ChooseProjectForm, self).__init__(*args, **kwargs) 
     self.data = self.data.copy() # IMPORTANT, self.data is immutable 
     # any condition: 
     if self.data.get('my_projects'): 
      my_projects = self.fields['project'].queryset.filter(my=True) 
      self.fields['project'].queryset = my_projects 
      self.fields['project'].initial = my_projects.first().pk 
      self.fields['project'].empty_label = None # disable "-----" 
      self.data.update(project=my_projects.first().pk) # Update Form data 
      self.fields['project'].widget = forms.HiddenInput() # Hide if you want 
Verwandte Themen