2009-08-07 7 views
7

में पहले दर्ज की गई जानकारी प्राप्त करें मैं फॉर्म विज़ार्ड का उपयोग करके एक साधारण Django बहु-पृष्ठ फ़ॉर्म बनाने की कोशिश कर रहा हूं। फ़ॉर्म को क्या करना चाहिए निम्नलिखित है:Django FormWizard

  1. विज़िटर को फ़ॉर्म में पहला और अंतिम नाम दर्ज करने दें।
  2. अगले पृष्ठ पर जारी रखें जहां पहले नाम और अंतिम नाम दर्ज किया जाएगा, इस पृष्ठ पर एक फ़ील्ड भी होगा जो विज़िटर को संदेश दर्ज करने देता है।
  3. विज़िटर Django done.html पृष्ठ पर ले जाया जाएगा जहां सभी जानकारी संग्रहीत और प्रदर्शित की जाएगी।

चरण 2 में, मैं मुसीबत पता लगाना कैसे कि आगंतुक चरण 1 मैं रूपों के लिए कोड और चरण 1 और नीचे 2 के लिए इस्तेमाल किया दो टेम्पलेट्स पोस्टिंग कर रहा हूँ में दी गई जानकारी को प्रदर्शित करने के लिए हो रही है : चरण 2 के लिए

{% block content %} 
<p>Step {{ step }} of {{ step_count }}</p> 
<form action="." method="post"> 
<table> 
{{ form }} 
</table> 
<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> 
{{ previous_fields|safe }} 
<input type="submit"> 
</form> 
{% endblock %} 

टेम्पलेट:

forms.py

from django import forms 
from django.shortcuts import render_to_response 
from django.contrib.formtools.wizard import FormWizard 

class ContactWizard(FormWizard): 
    def done(self, request, form_list): 
     return render_to_response('done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 

    def get_template(self, step): 
     return 'buydomain/templates/reg%s.html' % step 

class Form1(forms.Form): 
    firstName = forms.CharField() 
    lastName = forms.CharField() 

class Form2(forms.Form): 
    message = forms.CharField(widget=forms.Textarea) 

चरण 1 के लिए टेम्पलेट

{% block content %} 
<p>Step {{ step }} of {{ step_count }}</p> 


{% comment %} 
Show values entered into Form1 here ! 
{% endcomment %} 

<form action="." method="post"> 
<table> 
{{ form }} 
</table> 
<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> 
{{ previous_fields|safe }} 
<input type="submit"> 
</form> 
{% endblock %} 

मैं क्षमा चाहता हूं कि मैं कुछ हासिल करने के बारे में अस्पष्ट हूं, और मैं आशा करता हूं कि किसी के लिए समाधान की आपूर्ति की जा रही है। अग्रिम में धन्यवाद।

उत्तर

6

पहले कुछ सामान्य सलाह - अगर आपको समझ में नहीं आता कि Django में कुछ कैसे उपयोग करें, तो उस टेक्स्ट एडिटर को खींचें और कोड को देखें। यह हमेशा उत्तर पाने का सबसे तेज़ तरीका नहीं है, लेकिन मेरा मानना ​​है कि यह लंबे समय तक लाभांश का भुगतान करता है।

अपने फॉर्म विज़ार्ड उपclass में process_step को ओवरराइड करके दूसरे चरण में कुछ अतिरिक्त_कॉन्क्स्ट जोड़ने का प्रयास करें। यहाँ FormWizard भीतर से टिप्पणी (1.1 django) कर रहे हैं:

def process_step(self, request, form, step): 
     """ 
     Hook for modifying the FormWizard's internal state, given a fully 
     validated Form object. The Form is guaranteed to have clean, valid 
     data. 

     This method should *not* modify any of that data. Rather, it might want 
     to set self.extra_context or dynamically alter self.form_list, based on 
     previously submitted forms. 

     Note that this method is called every time a page is rendered for *all* 
     submitted steps. 
     """ 
     pass 

तो अपने स्वयं के ContactWizard कक्षा में, कुछ की तरह (नायब: मैं इस से नहीं चला):

class ContactWizard(FormWizard): 
    def process_step(self,request,form,step): 
     if step == 1: 
      self.extra_context = {'whatever': form.whatever_you_want_from_the_form} 
      return 
     else: 
      return 
+2

कैसे अनुवर्ती फ़ॉर्म कक्षा एक्सेस extra_context डेटा? – BozoJoe

+0

'extra_context' को 'फॉर्मविज़ार्ड' द्वारा प्रतिपादन के लिए टेम्पलेट में पास किया गया है। –

+0

मैंने अभी भी इस जवाब को उखाड़ फेंक दिया लेकिन दूसरों को सूचित करना चाहता था कि django 1.4 के रूप में प्रक्रिया_स्टेप विधि हस्ताक्षर केवल फॉर्म ऑब्जेक्ट में पास हो गया है। जैसे @bpoetz ने कहा, कृपया दस्तावेज़ों के साथ बैठें और उन्हें अपनी आवश्यकताओं के साथ काम करने वाले समाधान को खोजने के लिए पढ़ें। – avelis

3

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

class WizardRegistration(FormWizard): 
    def __init__(self, *args, **kwargs): 
     super(WizardRegistration, self).__init__(*args, **kwargs) 

     setattr(self, 'chosen', {}) 

चरणों के बीच आप आसानी से फॉर्म या मॉडल सामान ले सकते हैं और जब तक आप() विधि तक नहीं पहुंच जाते हैं तब तक इसे स्टोर करते हैं। एक फार्म मूल्य

self.chosen['something_to_store'] = form.cleaned_data.get('a_form_value') 
स्टोर

या यहां तक ​​कि प्राप्त/परिवर्तन/एक मॉडल को बचाने:

object = Model.objects.get('some_query') 

if self.chosen['object']: 
    self.chosen['object'].string = 'Something stringy' 
    self.chosen['object'].save() 
4

टोबी बख़्तरबंद का जवाब प्रपत्र वर्ग अतिरिक्त संदर्भ डेटा का उपयोग करने की अनुमति नहीं है - केवल टेम्पलेट फॉर्म पर पहुंच प्रदर्शित है। उस ने कहा, ऐसा लगता है कि यह संभवतः आपको चाहिए। हालांकि, अगर आपको पहुंच प्राप्त करने के लिए फॉर्म की आवश्यकता है, तो मैंने हल किया है कि get_form_kwargs को ओवरराइड करके। यह आम तौर पर एक खाली शब्दकोश देता है जो get_form populates करता है, इसलिए डेटा को उस डेटा के साथ एक शब्दकोश वापस करने के लिए ओवरराइड करके जिसे आप प्रीपोप्टेड की आवश्यकता है, आप अपने फॉर्म init में kwargs को पास कर सकते हैं।

def get_form_kwargs(self, step=None): 
    kwargs = {} 
    if step == '1': 
     your_data = self.get_cleaned_data_for_step('0')['your_data'] 
     kwargs.update({'your_data': your_data,}) 
    return kwargs 

फिर, अपने प्रपत्र init विधि में आप सिर्फ kwarg बंद बुला सुपर से पहले पॉप कर सकते हैं:

self.your_data = kwargs.pop('client', None)