2013-06-30 5 views
5

कहा जाता है, मैं एक इन्वेंट्री एप्लिकेशन के साथ एकीकृत करने की कोशिश कर रहा हूं और उपयोगकर्ताओं को एक Django रूप के माध्यम से सूची में भागों को जोड़ने की अनुमति देता हूं। मैं इन्वेंट्री डेटाबेस से पढ़ सकता हूं लेकिन एपीआई के माध्यम से लिखना है ताकि वे पिछले फॉर्म में जो दर्ज करते हैं उसके आधार पर मैं उन्हें जोड़ने के लिए उपलब्ध हिस्सों की एक सूची देना चाहता हूं। यहाँफॉर्म के रूप में Django फॉर्म सेटिंग ChoiceField विकल्पों को

class PartForm(forms.Form): 
    PART_CHOICES = (
    ('BT-J1KND-A', 'BT-J1KND-A'), 
    ('BT-J1KND-B', 'BT-J1KND-B'),) 
    part = forms.ChoiceField(choices = PART_CHOICES,required = True, label = 'Part to add to Inventory') 

और वह जगह है जहाँ मैं विकल्पों

parts_list = part_sql(part) 
#build choices 
PART_CHOICES= [(p[0],p[0]) for p in parts_list] 
form = PartForm() 
form.fields['part'].choices = PART_CHOICES 

यह टेम्पलेट में सही ढंग से प्रदर्शित करता है लेकिन जब मैं सेट:

यहाँ मेरी फार्म, मैं सिर्फ एक डिफ़ॉल्ट के रूप में कुछ विकल्प सेट किया गया है सहेजने के लिए जाएं और प्रपत्र को संसाधित करें यदि यह डिफ़ॉल्ट विकल्पों में से एक नहीं है, तो यह कहता है कि यह वैध विकल्प नहीं है।

Select a valid choice. BT-J1KND-C is not one of the available choices. 

मैं इसे वैध विकल्पों के रूप में सेट किए गए विकल्पों को स्वीकार करने के लिए कैसे ठीक करूं?

+0

लगभग कितने भाग विकल्प हैं? –

+0

अधिकतर 6 – enderv

उत्तर

10

एक बार अनुरोध संसाधित हो जाने पर, ऐसा लगता है कि आपका उपयोगकर्ता इनपुट हार्डकोडेड मानों का उपयोग करके एक असम्बद्ध PartForm में जाता है।

आदेश में अनुरोध ठीक से संसाधित करने के लिए, आप आप प्रारंभ में क्षेत्र के choices विशेषता को संशोधित करके आसानी से इस लक्ष्य को हासिल कर सकते हैं एक सुसंगत PartForm

की आवश्यकता है।

उदाहरण के लिए

:

class ExampleForm(forms.Form): 
    CHOICES = (
     ('EXMPL', 'Example'), 
    ) 
    field = forms.ChoiceField(choices=CHOICES, required=True, label='Example') 

    def __init__(self, custom_choices=None, *args, **kwargs): 
     super(ExampleForm, self).__init__(*args, **kwargs) 
     if custom_choices: 
      self.fields['field'].choices = custom_choices 

और फिर, सिर्फ सही ढंग से प्रपत्र प्रारंभ करने,

form = ExampleForm(my_custom_choices_nested_tuple, ...)

साथ तुम भी दोहरी जांच सकता है, जहां आप वास्तव में डेटा प्रोसेस कर रहे हैं याद (आपके प्रतिलिपि कोड में form = PartForm(request.REQUEST) का उल्लेख नहीं किया गया है, मुझे लगता है)

+0

यह एक त्रुटि से छुटकारा पाता है लेकिन अब डेटा को संसाधित करने का प्रयास करते समय मुझे मूल्य त्रुटि है। हाइलाइट किए गए लाइन को अनपैक करने के लिए ValueError बहुत सारे मान टेम्पलेट लाइन है जहां मैं {{form.as_p}} – enderv

+0

प्रदर्शित करता हूं ओह और केवल स्पष्टीकरण के लिए विकल्प को टुपल्स की सूची के रूप में फ़ॉर्म में पास किया जा रहा है, इसलिए मुझे नहीं पता कि समस्या ठीक है – enderv

+0

'फॉर्म = पार्टफॉर्म (अनुरोध।पोस्ट) '' form.is_valid(): 'हमेशा विफल रहता है – enderv

0

यदि आप प्रोग्राम रूप से किसी फॉर्म पर प्रोग्राम को बदलते हैं, तो मेरा मानना ​​है कि आपको बाद में फॉर्म पर full_clean() पर कॉल करने की आवश्यकता है ताकि परिवर्तन फ़ॉर्म में दिखाई दे। हम इसे एक ऐसे एप्लिकेशन पर करते हैं जिस पर मैं काम करता हूं - यहां वह कोड है जिसे हमने आपके उदाहरण के लिए संशोधित किया है।

from django.forms import Select 

... 

field = form.fields['part'] 
field.choices = PART_CHOICES 
field.widget = Select(choices=PART_CHOICES) 

form.fields['part'] = field 
form.full_clean() 

ध्यान दें कि रूप में अच्छी तरह field.choices बताए के रूप में, हम भी पुनः आरंभ कर field.widget

+0

होगा, यह भी सत्यापन त्रुटि से छुटकारा पा लिया है, लेकिन अब मेरे पास – enderv

+0

अनपैक करने के लिए बहुत सारे मान हैं। दिलचस्प है, हमारे पास हमारे अनुप्रयोगों में से एक में यह ठीक काम है, आप ऊपर कुछ उदाहरण कोड पेस्ट करेंगे ताकि आप कर सकें देखें कि हमारा समाधान आपके से अलग कैसे है। – robjohncox

+0

धन्यवाद आप बहुत – enderv

संबंधित मुद्दे