2012-07-23 65 views
1

我正在重写我们应用程序的一大部分,它需要用户创建一个Project并附上RewardsDjango-formwizard和ModelFormSet保存

的形式被分成不同的步骤,前两个是正常Project,下一个是Rewards,然后最后一个简单的预览,让用户轻弹来回打造一个完美Project

我forms.py

class BaseRewardFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(BaseRewardFormSet, self).__init__(*args, **kwargs) 
     self.queryset = Reward.objects.none() 

RewardFormSet1 = modelformset_factory(Reward, extra=2, exclude=('project'), formset=BaseRewardFormSet) 

class ProjectForm1(forms.ModelForm): 
    """docstring for ProjectForm1""" 
    class Meta: 
     model = Project 
     exclude=(...) 

class ProjectForm2(forms.ModelForm): 
    """docstring for ProjectForm2""" 
    class Meta: 
     model = Project 
     exclude = (...) 

我urls.py

instance_dict = {'2': Reward.objects.none()} 
url(r'^new-project/$', login_required(ProjectWizard.as_view([ProjectForm1, ProjectForm2, RewardFormSet1, ProjectForm3], instance_dict=instance_dict))), 

我views.py

class ProjectWizard(SessionWizardView): 
    file_storage = cloudfiles_storage 

    def get_context_data(self, form, **kwargs): 
     context = super(ProjectWizard, self).get_context_data(form, **kwargs) 
     initial_dict = self.get_form_initial('0') 
     if self.steps.current == '1': 
      step1_data = self.get_cleaned_data_for_step('0') 
      context.update({'step1_data':step1_data,'currency_sign':step1_data['base_currency']}) 
     else: 
      step1_data = self.get_cleaned_data_for_step('0') 
      step2_data = self.get_cleaned_data_for_step('1') 
      step3_data = self.get_cleaned_data_for_step('2') 
      context.update({'step1_data':step1_data,'step2_data':step2_data,'step3_data':step3_data,}) 
     return context 

    def get_template_names(self): 
     step = int(self.steps.current) 
     if step == 3: 
      return 'formwizard/preview.html' 
     else: 
      return 'formwizard/wizard_form.html' 

    def done(self, form_list, *args, **kwargs): 
     form_data = form_list[0].cleaned_data 
     form_data_details = form_list[1].cleaned_data 
     form_data.update(form_data_details) 
     project = Project() 
     for field in project.__dict__.iterkeys(): 
      if field in form_data: 
       project.__dict__[field] = form_data[field] 
     project.owner = self.request.user 
     project.date_published = datetime.now() 
     project.save()   
     return render_to_response('formwizard/done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 

渲染时redirec吨,它显示所有的数据已被清理,这意味着该表格是有效的,并且所有的项目数据被保存到项目

我可以看到奖励数据将不会保存,因为它没有被称为,但是迄今为止我尝试过的每个解决方案都失败了。

我该如何在保存时实现对此解决方案的奖励?

也许有人可以对此有所了解,非常感谢!

+0

最新问题? – Rohan 2012-07-23 12:36:46

+0

@Rohan编辑这个问题,底部 – ApPeL 2012-07-23 12:39:59

回答

1

这工作?假设Rewardproject

for rw in form_list[2].save(commit=False): 
    rw.project = project 
    rw.save() 
+0

该解决方案结束了工作,我认为整个过程:( – ApPeL 2012-07-23 20:16:34