2012-12-11 12 views
7

मेरे पास मेरे मॉडल में से किसी एक की सामग्री बनाने के लिए एक Django फॉर्म विज़ार्ड अच्छी तरह से काम कर रहा है। मैं मौजूदा सामग्री के डेटा को संपादित करने के लिए एक ही विज़ार्ड का उपयोग करना चाहता हूं लेकिन इसे कैसे करना है इसका एक अच्छा उदाहरण नहीं मिल रहा है।मॉडल संपादित करने के लिए Django फॉर्म विज़ार्ड

forms.py

class ProjectEssentialsForm(forms.ModelForm): 
    class Meta: 
     model = Project 
     fields = [ 
      'title', 
      'short_description', 
      'who_description', 
      'problem_description', 
      'solution_description' 
     ] 

class ProjectYourInfoForm(forms.ModelForm): 
    class Meta: 
     model = Project 
     fields = [ 
      'gender', 
      'location', 
      'post_code', 
      'sector', 
     ] 

views.py

TEMPLATES = { 
    'project_essentials': 'projects/essentials-form.html', 
    'project_your_info': 'projects/your-info-form.html', 
} 


class ProjectWizard(SessionWizardView): 
    instance = None 

    def get_form_instance(self, step): 
     """ 
     Provides us with an instance of the Project Model to save on completion 
     """ 
     if self.instance is None: 
      self.instance = Project() 
     return self.instance 

    def done(self, form_list, **kwargs): 
     """ 
     Save info to the DB 
     """ 
     project = self.instance 
     project.save() 

    def get_template_names(self): 
     """ 
     Custom templates for the different steps 
     """ 
     return [TEMPLATES[self.steps.current]] 

urls.py

FORMS = [ 
    ('project_essentials', ProjectEssentialsForm), 
    ('project_your_info', ProjectYourInfoForm), 
] 

urlpatterns = patterns('', 
    (r'^projects/add$', ProjectWizard.as_view(FORMS)), 
) 

मैं देख रहा हूँ:

यहाँ मेरी परियोजना कोड का एक सरलीकृत संस्करण है कि यह कार्य 012 ​​है फॉर्म उदाहरण को सेट करने के लिए, लेकिन मुझे यकीन नहीं है कि आप मॉड्यूल आईडी को यहां लुक-अप करने के लिए कैसे और कैसे कोड काम करेंगे।

एक कोड उदाहरण या एक लिंक को सबसे अधिक सराहना की जाएगी।

धन्यवाद, पीट

उत्तर

10

मैं सिर्फ यह इतना काम कर मामले में जवाब पोस्ट करेंगे यह किसी और मदद करती हैं।

आप आइटम की आईडी पारित आप इस तरह urls.py में संपादित करना चाहते हैं कर सकते हैं:

(r'^projects/edit/(?P<project_id>[-\d]+)$', ProjectWizard.as_view(FORMS)), 

इसके बाद आप आइटम निम्न कोड के साथ में

views.py देख सकते हैं :

class ProjectWizard(SessionWizardView): 
    def get_form_initial(self, step): 
     if 'project_id' in self.kwargs and step == 'project_essentials': 
      project_id = self.kwargs['project_id'] 
      project = Project.objects.get(id=project_id) 
      from django.forms.models import model_to_dict 
      project_dict = model_to_dict(project) 
      return project_dict 
     else: 
      return self.initial_dict.get(step, {}) 

आपको मॉडल को एक dict में बदलने की आवश्यकता है ताकि आप इसे प्रारंभिक डेटा के रूप में सेट कर सकें।

+0

मैं फॉर्म विज़ार्ड को लागू करने की कोशिश कर रहा हूं, मैं एक समस्या से फंस गया हूं। क्या आप कृपया मदद कर सकते हैं: यहां पोस्ट है: http://stackoverflow.com/questions/24173367/form-wizard-initial-data-for-edit-not-loading-properly-in-django –

+0

मैं लोड करने में सक्षम हूं पहले फॉर्म पर प्रारंभिक डेटा, लेकिन पहले फॉर्म को सबमिट करने के बाद, यह यूआरएल बनाने के लिए निर्देशित करता है उदाहरण: से/आइटम/एडिट/1 से/आइटम/बनाने के बाद मैं सबमिट करता हूं –

1

pxg के जवाब के अलावा, get_form_instance इस तरह होना चाहिए, अन्यथा आप संपादन नहीं किया जाएगा, लेकिन यह मॉडल का एक नया उदाहरण बनाने के लिए:

def get_form_instance(self, step): 
    if not self.instance: 
     if 'initial_id' in self.kwargs: 
      initial_id = self.kwargs['initial_id'] 
      self.instance = Project.objects.get(id=initial_id) 
     else: 
      self.instance = Project() 

    return self.instance 
2

pxg के जवाब अपर्याप्त है। जैसा कि एमिन-बगरा-सरल द्वारा इंगित किया गया है, यह इसे संपादित करने के बजाय मॉडल का एक नया उदाहरण बनाता है। और एमिन-बगरा-सरल का जवाब, स्वयं ही पर्याप्त नहीं है। या तो get_form_initial विधि ओवरराइड न करें और प्रारंभिक_डिक्ट मान सेट न करें या इस उत्तर में दिए गए कार्यान्वयन का उपयोग न करें।

urls.py में

:

(r'^projects/edit/(?P<project_id>[-\d]+)$', ProjectWizard.as_view(FORMS)),

views.py में:

class ProjectWizard(SessionWizardView): 
    def get_form_initial(self, step): 
     if 'project_id' in self.kwargs: 
      return {} 
     return self.initial_dict.get(step, {}) 

    def get_form_instance(self, step): 
     if not self.instance: 
      if 'project_id' in self.kwargs: 
       project_id = self.kwargs['project_id'] 
       self.instance = Project.objects.get(id=project_id) 
      else: 
       self.instance = Project() 
     return self.instance 

जबकि की get_form_initial वास्तव में काम करेगा pxg के संस्करण (इस तरह आप अपने जवाब को संयोजित करना चाहिए है जब तक आप get_form_instance ओवरराइड भी जोड़ते हैं) उदाहरण को देखने, इसके डेटा निकालने और प्रारंभिक मूल्य बनाने के लिए आवश्यक नहीं है ई शब्दकोश यह सब प्रारंभिक_डिक्ट से उदाहरण आरंभ करने से पहले मॉडलफॉर्म द्वारा स्वचालित रूप से किया जाता है।एक खाली प्रारंभिक मूल्य शब्दकोश को वापस लौटने से आपके पास सरल, अधिक कुशल कोड होगा।

+0

आप Django का किस संस्करण का उपयोग कर रहे हैं? मुझे संदेह है कि यह हाल के संस्करणों में बदल सकता है, मैं Django 1.4.2 का उपयोग कर रहा था जब मैंने इस मुद्दे को मारा। अगर आपका उत्तर अब पुराना है तो अपना समाधान आज़माएं और मेरा जवाब अपडेट करें। निस्संदेह मैं 1.4.2 के साथ काम करने के आपके समाधान की संभावना से इंकार नहीं कर रहा हूं, भले ही आपका समाधान काम करता है तो मैं अपना जवाब अपडेट करूंगा। – pxg

+0

मैं Django 1.4.16 का उपयोग कर रहा हूँ – nmgeek

0

मुझे इसे Django 1.11 में django-formtools 2.1 के साथ काम करने के लिए थोड़ा सा संपादित करना पड़ा।

class ProjectWizard(SessionWizardView): 
    def get_form_initial(self, step): 
     if 'project_id' in self.kwargs: 
      return {} 
     return self.initial_dict.get(step, {}) 

    def get_form_instance(self, step): 
     if not self.instance_dict: 
      if 'project_id' in self.kwargs: 
       project_id = self.kwargs['project_id'] 
       return Project.objects.get(id=project_id) 
     return None 

get_form_instance विधि अब either an object or None to be returned की उम्मीद है।

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