2009-05-01 9 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

जब से तुम पोस्ट डेटा में पारित नहीं कर रहे हैं, मैं मान लेंगे कि तुम क्या करने कोशिश कर रहे हैं एक प्रारंभिक मान सेट किया गया है जो फ़ॉर्म में प्रदर्शित होगा। जिस तरह से आप यह करते हैं initial कीवर्ड के साथ।

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

अधिक स्पष्टीकरण के लिए Django Form docs देखें।

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

चेक ऊपर संदर्भित डॉक्स और अधिक के लिए एक और तरीका है का उपयोग कर cleaned_data

+0

यही वही है जो मैं करना चाहता हूं। धन्यवाद! – Eldila

+0

धन्यवाद, मेरे लिए भी वही है जो मुझे चाहिए .. – Neo

+1

यह पुष्टि करता है कि मुझे क्या पता था, लेकिन मेरा 'ModelChoiceField' अभी भी अमान्य_चॉइस दे रहा है जब मैं इसे' प्रारंभिक 'मान देता हूं :( –

-12

यह करने के लिए पर:

आप एक मान बदलने के लिए के बाद प्रपत्र प्रस्तुत की गई थी की कोशिश कर रहे हैं, तो आप की तरह कुछ का उपयोग कर सकते

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

यह मेरे लिए विफल रहता है। मेरे पास मेरे फॉर्म की __init__ विधि में उपरोक्त की तरह एक पंक्ति है, और यह "एट्रिब्यूट एरर: यह क्वेरी डिक्ट इवेंट अपरिवर्तनीय है" –

+0

यह कोड केवल तब काम करता है जब फ़ॉर्म initia रहा है किसी भी फार्म डेटा के बिना lised। नतीजतन, request.GET या request.POST जैसी एक अपरिवर्तनीय वस्तु बाध्य नहीं होगी, इसलिए आपको एक खाली शब्दकोश (form.data) मिलेगा जिसे बिना किसी त्रुटि के बदला जा सकता है। एफवाईआई मैं Django 1.6.3 – potar

+0

का उपयोग कर रहा हूं यह काम करेगा यदि आपका "सामग्री-प्रकार" शीर्षलेख "मल्टीपार्ट/फॉर्म-डेटा" पर सेट है।यह तब विफल रहता है जब आप किसी सामग्री-प्रकार का "एप्लिकेशन/एक्स-www-form-urlencoded" का उपयोग करते हैं। मुझे नहीं पता क्यों, लेकिन यह डीबग करने के लिए ***** था। – teewuane

74

आप पहले से ही initiali कर दिया है तो:, अगर आप पहले से ही (के साथ या डेटा के बिना) एक रूप initialised है, और आप इसे प्रदर्शित करने से पहले आगे डेटा जोड़ने की जरूरत फॉर्म zed, आप क्षेत्र की प्रारंभिक संपत्ति का उपयोग कर सकते हैं। आप प्रपत्र के भीतर यह करना चाहते हैं

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

धन्यवाद। जबकि स्वीकार्य उत्तर सुझाया गया तरीका है, आप "वास्तव में प्रश्न का उत्तर" पुरस्कार जीतते हैं। यही वह है जिसे मैं ढूंढ रहा था (और Google में क्या आता है)। – jason

+0

एक फ़ॉर्मेट के साथ लूप के लिए भी बहुत अच्छा काम करता है, बस फॉर्मेट में फॉर्म के लिए तर्क का उपयोग करें और आप ऊपर देखे गए विकल्प और प्रारंभिक डेटा सेट कर सकते हैं। – radtek

+5

क्या यह करने का कोई अलग तरीका है Django 1.7/पायथन 3.4? यह मेरे लिए काम नहीं कर रहा है – Jeremy

5

कुछ निगेल कोहेन की तरह अगर आप प्रपत्र डेटा के एकत्र सेट के एक प्रतिलिपि करने के लिए डेटा जोड़ रहे थे काम करेगा

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' 
+1

मैं कच्चे डेटा को ओवरराइड करने का बड़ा प्रशंसक नहीं हूं। यदि आपको बिल्कुल ऐसा करना है, तो आपको संभवतः 'डेटा [form.add_prefix (' ईमेल ')]' को उन मामलों के लिए करना चाहिए जहां उपसर्ग सेट किया गया है। – Josh

+2

क्या यह करने का कोई अलग तरीका है Django 1.7/पायथन 3.4? यह मेरे लिए काम नहीं कर रहा है – Jeremy

+0

यदि मूल फॉर्म रखने की आवश्यकता नहीं है तो तीसरी पंक्ति थोड़ी कम हो सकती है: 'form.data = form.data.copy()' – ZZY

6

: उदाहरण के लिए,

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

बस अपने Form.data क्षेत्र बदलने के लिए:: किसी कारण से __init__ विधि, आप initial dict में हेरफेर कर सकते हैं

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 
संबंधित मुद्दे