Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django formwizard和ModelFormSet保存_Python_Django_Django Views_Formwizard_Django Formwizard - Fatal编程技术网

Python Django formwizard和ModelFormSet保存

Python Django formwizard和ModelFormSet保存,python,django,django-views,formwizard,django-formwizard,Python,Django,Django Views,Formwizard,Django Formwizard,我正在重写我们应用程序的一大块,它要求用户创建一个项目,并附带奖励 表单分为不同的步骤,前两个步骤是正常的项目,下一个步骤是奖励,最后是一个简单的预览,让用户来回切换以创建一个完美的项目 for rw in form_list[2].save(commit=False): rw.project = project rw.save() 我的表单.py class BaseRewardFormSet(BaseModelFormSet): def __init__(self,

我正在重写我们应用程序的一大块,它要求用户创建一个
项目
,并附带
奖励

表单分为不同的步骤,前两个步骤是正常的
项目
,下一个步骤是
奖励
,最后是一个简单的预览,让用户来回切换以创建一个完美的
项目

for rw in form_list[2].save(commit=False):
    rw.project = project
    rw.save()
我的表单.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 = ( ... )
instance_dict = {'2': Reward.objects.none()}
url(r'^new-project/$', login_required(ProjectWizard.as_view([ProjectForm1, ProjectForm2, RewardFormSet1, ProjectForm3], instance_dict=instance_dict))),
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],
        })
我的URL.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 = ( ... )
instance_dict = {'2': Reward.objects.none()}
url(r'^new-project/$', login_required(ProjectWizard.as_view([ProjectForm1, ProjectForm2, RewardFormSet1, ProjectForm3], instance_dict=instance_dict))),
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],
        })
我的观点。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 = ( ... )
instance_dict = {'2': Reward.objects.none()}
url(r'^new-project/$', login_required(ProjectWizard.as_view([ProjectForm1, ProjectForm2, RewardFormSet1, ProjectForm3], instance_dict=instance_dict))),
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],
        })
渲染重定向时,它显示所有数据都已清理,这意味着表单有效,并且所有项目数据都保存到project

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

如何在保存时在此解决方案中实施奖励?


也许有人可以解释一下,非常感谢

这样行吗?假设
奖励
项目

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

@Rohan在中编辑了这个问题,在解决方案最终奏效时,我对整个过程进行了过度思考:(