2015-11-10 13 views
6

मेरे पास कई रूप हैं जिन्हें मैंने विज़ार्ड में जोड़ा है, लेकिन फॉर्म स्टेट केवल अंतिम चरण के लिए बनाए रखा गया है, और किया गया() निष्पादित नहीं किया गया है।सत्र विज़ार्ड दृश्य राज्य केवल अंतिम फॉर्म पर सहेजा गया, किया गया() निष्पादित नहीं किया गया

मैंने निम्न के नीचे जाने की कोशिश करने के लिए, डीजेंगो के दस्तावेज़ीकरण पर उदाहरणों के आधार पर निम्नलिखित बनाया है। ऐसा लगता है कि अंतिम चरण ही एकमात्र ऐसा है जो चरणों में आगे बढ़ते समय राज्य को बचाता है।

class OneForm(Form): 
    field_one = forms.CharField(label='1', max_length=100) 
    field_two = forms.CharField(label='2', max_length=100) 
    field_three = forms.CharField(label='3', max_length=100) 
class TwoForm(Form): 
    field_one = forms.CharField(label='4', max_length=100) 
    field_two = forms.CharField(label='5', max_length=100) 
    field_three = forms.CharField(label='6', max_length=100) 

TEST_WIZARD_FORMS = [ 
    ("one", OneForm), 
    ("two", TwoForm), 
] 
TEST_TEMPLATES = { 
    'one': 'tour/one.html', 
    'two': 'tour/two.html', 
} 
class TestWizardView(SessionWizardView): 
    form_list = TEST_WIZARD_FORMS 
    def done(self, form_list, **kwargs): 
     print('done executed') 
     return reverse('home') 
    def get_template_names(self): 
     return [TEST_TEMPLATES[self.steps.current]] 

और इस टेम्पलेट के लिए (दोनों one.html और two.html समान हैं)

<html> 
<body> 
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p> 
<form action="" method="post">{% csrf_token %} 
<table> 
{{ wizard.management_form }} 
{% if wizard.form.forms %} 
    {{ wizard.form.management_form }} 
    {{ wizard.form.non_field_errors }} 
    {{ wizard.form.errors }} 
    {% for form in wizard.form.forms %} 
     {{ form }} 
    {% endfor %} 
{% else %} 
    {{ wizard.form }} 
{% endif %} 
</table> 
{% if wizard.steps.prev %} 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">"first step"</button> 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">"prev step"</button> 
{% endif %} 
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.next }}">"next step"</button> 
<input type="submit" value="submit"/> 
</form> 
</body> 
</html> 

अगर मैं चरण 1 पर डेटा दर्ज, 2 कदम और डेटा दर्ज करें, फिर कदम पर लौटने के लिए आगे बढ़ना 1, पहले चरण में कोई डेटा सहेजा नहीं गया है और कोई फॉर्म त्रुटियां प्रदर्शित नहीं हुई हैं। जब मैं चरण 2 पर वापस जाने के बाद हिट करता हूं, तो चरण 2 का डेटा अभी भी मौजूद है। जानबूझकर चरण 1 पर अमान्य डेटा डालने से मुझे पता चला है कि यह फ़ॉर्म को मान्य नहीं करता है, क्योंकि विज़ार्ड त्रुटियों को प्रदर्शित किए बिना चरण 2 जारी रखता है।

जब मैं फॉर्म जमा करता हूं, किया जाता है() निष्पादित नहीं होता है। यह समझ में आता है कि केवल अंतिम चरण वास्तव में सफल है, लेकिन चरण 1 पर कोई त्रुटि नहीं देखते हुए मुझे परेशान किया गया है।

अंतिम रूप को छोड़कर फॉर्म डेटा क्यों नहीं बनाए रखा जाता है? अंतिम चरण केवल एकमात्र ऐसा क्यों है जो वास्तव में फॉर्म डेटा को मान्य करता है? निष्पादित क्यों नहीं किया जाता है?

अद्यतन: ऐसा प्रतीत होता है कि फॉर्म सत्यापन बाद में हो रहा है, और मुझे लगता है कि यह पोस्ट फ़ंक्शन में प्रासंगिक जानकारी प्रिंटिंग के माध्यम से सफल रहा है, लेकिन किया गया() अभी भी निष्पादित नहीं लगता है।

धन्यवाद।

उत्तर

1

प्रलेखन में चरण 1 here उत्तर मिला है। यह निम्नलिखित बताता है।

उपयोगकर्ता विज़ार्ड के पहले पृष्ठ पर जाता है, फ़ॉर्म में भरता है और इसे सबमिट करता है।

यहां कुंजी "सबमिट" है। जब तक फ़ॉर्म सबमिट नहीं किया जाता है तब तक कोई फॉर्म सत्यापन या स्थिति सहेजी नहीं जाती है। अगली/पिछली/कूद के लिए wizard_goto_step का उपयोग फॉर्म सबमिट नहीं करता है, फ़ॉर्म को मान्य नहीं करता है, और सत्र/कुकी (जिसे आप चुनते हैं) में फ़ॉर्म को सहेजता नहीं है।

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

ऐसा लगता है कि अपूर्ण होने पर भी फॉर्म डेटा सहेजा जाना चाहिए। मेरा इरादा भंडारण.set_step_data() फ़ंक्शन का उपयोग करके मैन्युअल रूप से इस डेटा को सहेजना है, क्योंकि सभी प्रपत्र चरणों को अंतिम प्रक्रिया में फिर से सत्यापित किया जाता है। भले ही कोई उपयोगकर्ता एक चरण पर गलत डेटा भरता है, फिर भी वे अंत में लापता डेटा वाले चरण पर रीडायरेक्ट किए जाएंगे। जब वे पिछले चरण पर जाते हैं तो उपयोगकर्ता के डेटा को अंधेरे से पोंछने से बेहतर व्यवहार की तरह लगता है।

0

यह निश्चित रूप से एक बग है। आपको

\ formtools \ जादूगर \ विचारों से कोड की निम्नलिखित पंक्तियों को हटाना होगा।पीई

 # walk through the form list and try to validate the data again. 
#   for form_key in self.get_form_list(): 
#    form_obj = self.get_form(step=form_key, 
#     data=self.storage.get_step_data(form_key), 
#     files=self.storage.get_step_files(form_key)) 
#    if not form_obj.is_valid(): 
#     return self.render_revalidation_failure(form_key, 
#               form_obj, 
#               **kwargs) 
#    final_forms[form_key] = form_obj 

दरअसल मैं इस कोड के कारण को समझ नहीं पा रहा हूं। सबमिट किए जाने के बाद प्रत्येक फॉर्म को सत्यापित किया गया था। मुझे फिर से सत्यापित करने का कोई कारण नहीं है?

यह सत्यापन किसी अज्ञात कारण के लिए विफल रहता है, और यही कारण है कि बाद में किए गए दिनचर्या को कभी भी बुलाया नहीं जाता है।

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