编辑Django Formwizard:获取初始数据

时间:2013-02-18 18:10:51

标签: django edit wizard

我正在尝试使用我的Django FormWizard编辑现有对象。我遵循this blog post中描述的技术,但它不起作用。这是我的编辑视图:

@login_required
def edit_wizard(request, id):
    thing = get_object_or_404(Thing, pk=id)
    if thing.user != request.user:
        raise HttpResponseForbidden()
    else:
        initial = {0: {'year': thing.year,
                       'make': thing.make,
                       'series': thing.series,
                        ....etc.
                       },
                   1: {'condition': thing.condition,
                        ....etc.
                       },
                   }

     form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial_dict=initial)
     return form(context=RequestContext(request), request=request)

您能帮我弄清楚如何向向导提供初始数据,以便我可以允许用户编辑他们的对象吗?谢谢你的想法!


编辑:(2013年2月18日)

得到了:

TypeError at /edit/10/   __init__() takes exactly 1 argument (3 given)

这可以通过@ sneawo的答案解决,但仍然没有传递初始数据,而是向导创建新对象。


编辑:(2013年2月19日)

class CreateWizard(SessionWizardView):
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
    def done(self, form_list, **kwargs):
        instance = Thing()
        for form in form_list:
            for field, value in form.cleaned_data.iteritems():
                setattr(instance, field, value)
        instance.user = self.request.user
        instance.save()
        return render_to_response('wizard-done.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })

2 个答案:

答案 0 :(得分:2)

根据文档,对于Django 1.4+,您可以在 initial_dict 关键字参数中传递初始数据。对于以前的版本(1.3,它似乎在1.3之前不存在),关键字参数为 initial 。此外,初始数据字典中的步骤键应该是字符串而不是整数。

initial = {'0': {'year': thing.year,
                 'make': thing.make,
                 'series': thing.series,
                  ....etc.
                },
           '1': {'condition': thing.condition,
                  ....etc.
                },
          }

<强>更新: 要更新同一个对象,您还必须设置id,否则django无法知道要更新的对象。一种简单的方法是在隐藏字段中传递id,但是必须在(完成)方法中再次执行用户权限检查。

initial = {0: {'id': thing.id,


class CreateWizard(SessionWizardView):
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
    def done(self, form_list, **kwargs):
       id = form_list[0].cleaned_data['id']
       thing = get_object_or_404(Thing, pk=id)
       if thing.user != self.request.user:
           raise HttpResponseForbidden()
       else:
         instance = Thing()
         for form in form_list:
             for field, value in form.cleaned_data.iteritems():
                 setattr(instance, field, value)
         instance.user = self.request.user
         instance.save()
         return render_to_response('wizard-done.html', {
             'form_data': [form.cleaned_data for form in form_list],})

当然,StepOneForm应该有隐藏字段的id:

class StepOneForm(forms.Form):
    id = forms.IntegerField(widget=forms.HiddenInput)

答案 1 :(得分:1)

尝试使用form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial=initial)