2009-05-01 111 views
85

我試圖在表單初始化後將字段設置爲某個值。Django在表單初始化後設置字段值

例如,我有以下類。

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

在視圖中,我希望能夠做這樣的事情:

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

return HttpResponse(t.render(c)) 

回答

105

既然你不能傳遞POST數據,我假設你正在嘗試做的設置一個初始值,將在窗體中顯示。你這樣做的方式是使用initial關鍵字。

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

有關更多說明,請參閱Django Form docs。使用cleaned_data

+0

這正是我想要做的。謝謝! – Eldila 2009-05-01 22:30:24

+0

謝謝,對我來說,我也正是我需要的.. – Neo 2011-09-14 06:29:36

+1

這證實了我所知道的,但是當我給它一個`initial`值時,我的`ModelChoiceField`仍然會給invalid_choice:( – 2012-10-05 07:13:14

-12

另一種方式來做到這一點

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

檢查上文所引用文檔的更多:

如果你想提交表單後更改值,你可以使用像如果你已經初始化形式(有或無數據),你需要顯示它之前進一步補充數據:

form.data['Email] = GetEmailString() 
74

如果您已經initiali zed表單,您可以使用該字段的初始屬性。

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

喜歡的東西奈傑爾·科恩的會,如果你將數據添加到收集的一組表格數據的副本工作出於某種原因__init__方法,你可以操縱initial字典:

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' 
6

如果你想要從窗體的做到這一點:例如,

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

只要改變你的Form.data領域:

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