2009-06-01 3 views
44

तैयार करें मैं कुछ जानकारी के आधार पर अपने django रूप में डेटा को पूर्ववत करने की कोशिश कर रहा हूं, लेकिन मॉडलफॉर्म का उपयोग नहीं कर रहा हूं, इसलिए मैं केवल इंस्टेंस सेट नहीं कर सकता।Django (गैर-मॉडल) फॉर्म

ऐसा लगता है कि यह वास्तव में आसान होना चाहिए, लेकिन किसी कारण से मुझे कोई दस्तावेज नहीं मिल रहा है कि मुझे यह कैसे करना है।

class MyForm(forms.Form): 
    charfield1 = forms.CharField(max_length=3) 
    charfield2 = forms.CharField(max_length=3) 
    choicefield = forms.ModelChoiceField(MyModel.objects.all()) 

मैं सिर्फ कर की कोशिश की:

form = MyForm() 
form.charfield1 = "foo" 
form.charfield2 = "bar" 
# a model choice field 
form.choicefield = MyModel.objects.get(id=3) 

जो काम नहीं करता है यह मेरा रूप है।

उत्तर

79

प्रयास करें:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'}) 

Form वस्तुओं के निर्माता फ़ील्ड मानों का एक शब्दकोश ले सकते हैं। यह एक बाध्य रूप बनाता है, जिसका उपयोग डेटा को सत्यापित करने के लिए किया जा सकता है और फॉर्म को प्रदर्शित डेटा के साथ HTML के रूप में प्रस्तुत किया जा सकता है। अधिक जानकारी के लिए the forms API दस्तावेज़ीकरण देखें।

संपादित करें:

:

पूर्णता के लिए के लिए, यदि आप प्रपत्र बाध्य करने के लिए नहीं करना चाहते हैं, और आप बस कुछ क्षेत्रों के लिए प्रारंभिक मान घोषित करने के लिए चाहते हैं, आप के बजाय निम्न का उपयोग कर सकते

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'}) 

विवरण के लिए initial values के दस्तावेज़ीकरण देखें।

+0

धन्यवाद - यह काम करता है। हालांकि, यह एक मॉडल के लिए विदेशी कुंजी के साथ काम नहीं करता है। मैंने मॉडल उदाहरण में खुद को शब्दकोश में गुजरने का प्रयास किया, जो अपवाद फेंकता है, और मैंने पीके/आईडी में गुजरने की कोशिश की, जो असफल नहीं है, लेकिन यह मेरे फॉर्म यूआई में इसे सही ढंग से लोड नहीं करता है। – Cory

+0

ऑब्जेक्ट आईडी का उपयोग करना चाहिए। मैंने इसे मॉडल चॉइसफाल्ड के साथ अभी परीक्षण किया है। क्या आप हमें अपनी फॉर्म परिभाषा दिखा सकते हैं? –

+0

ने संपादन में फॉर्म परिभाषा को जोड़ा। – Cory

23

Django फॉर्म populating के दो तरीके हैं।

सबसे पहले जब आप इसे तुरंत चालू करते हैं तो पहले शब्द के रूप में एक शब्दकोश को पास करना है (या इसे data kwarg के रूप में पास करना, जो एक ही बात है)। जब आप फॉर्म को पॉप्युलेट और सत्यापित करने के लिए POST डेटा का उपयोग करना चाहते हैं तो यह वही होता है।

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3} 
form = MyForm(data_dict) 

हालांकि, इस फार्म पर सत्यापन ट्रिगर किया जाएगा, इसलिए केवल काम करता है अगर आप वास्तव में वैध है और पूरा डेटा में गुजर रहे हैं के साथ शुरू - अन्यथा आप त्रुटियों के साथ शुरू होगा।

एक फॉर्म को पॉप्युलेट करने का दूसरा तरीका initial पैरामीटर (दस्तावेज here) का उपयोग करना है। यह फॉर्म फ़ील्ड के लिए प्रारंभिक मान देता है, लेकिन ट्रिगर सत्यापन नहीं करता है। इसलिए यदि आप सभी मानों को भर नहीं रहे हैं, तो उदाहरण के लिए यह उपयुक्त है।

form = MyForm(initial=data_dict) 

initial के माध्यम से एक choicefield भर दें, पी के मूल्य का उपयोग करें।

+0

उपरोक्त के आधार पर आप ग्राहक फॉर्म फ़ील्ड को डेटा कैसे प्रदान करते हैं? – Chris

+0

@ क्रिस, यदि आपके पास कोई प्रश्न है और यह उपरोक्त द्वारा कवर नहीं है, तो कृपया एक नया प्रश्न खोलें और पूर्ण विवरण के साथ वहां से पूछें। –

+0

यह इस उत्तर से संबंधित एक साइड सवाल था। – Chris

12

आप उदाहरण के लिए एक शब्दकोश में कनवर्ट करने के लिए model_to_dict() का उपयोग कर सकते हैं, और उसके बाद एक फॉर्म बना सकते हैं। कुछ इस तरह काम करना चाहिए:

from django.forms.models import model_to_dict 
... 
my_obj = MyModel.objects.get(abc=123) 
form = MyForm(initial=model_to_dict(my_obj)) 

नोट: मैं Django संस्करण 1.3

1

उपयोग कर रहा हूँ क्या यह लायक है के लिए, FormView वर्ग आधारित दृश्य तरीका यह है ओवरराइड करने के लिए किया जाएगा FormView के get_initial समारोह।get_initial प्रपत्र को तुरंत चालू करने के लिए get_form_kwargs द्वारा उपयोग किए गए प्रारंभिक कीवर्ड तर्क देता है।

डॉक्स:

  • get_initial के लिए, here, get_form_kwargs के लिए
  • , here

नमूना कोड:

from django.views.generic.edit import FormView 

class MyFormView(FormView): 

    def get_initial(self): 
     initial = super(MyFormView, self).get_initial() 
     # update initial field defaults with custom set default values: 
     initial.update({'charfield1': 'foo', 'charfield2': 'bar'}) 
     return initial