2013-02-18 62 views
1

我想用我的Django FormWizard编辑现有的对象。我遵循this blog post中描述的技术,但它不起作用。这里是我的编辑观点:编辑Django Formwizard:获取初始数据

@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) 

你能不能帮我找出如何提供初始数据向导,这样我可以允许用户编辑自己的对象吗?感谢您的想法!


编辑:(13年2月18日)

是越来越答:

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

这是由以下@ sneawo的回答解决了,但仍然没有初始数据过去了,而不是创建新的对象。


编辑:(13年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], 
     }) 
+0

为什么你使用'东西=东西''在条件else'(用户= request.user)? – sneawo 2013-02-18 22:00:45

+0

哦,是的。我的错。删除那个条件,但是,现在有一个'TypeError:__init __()只需要1个参数(给出3个)'。上面增加了细节。感谢您的任何想法! – 2013-02-18 22:15:31

+0

你还可以显示'CreateWizard'类的代码吗? – sneawo 2013-02-19 08:35:08

回答

2

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

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

UPDATE: 要更新您必须设置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) 
+0

谢谢@almalki。将初始数据字典设置为字符串可以让我在表单中获得'initial_dict'。但是,创建新实例而不是修改原始实例。你能帮我理解为什么吗?谢谢! – 2013-02-21 18:05:58

+0

@NickB当然,看到更新的答案:) – almalki 2013-02-21 18:24:31

+0

感谢您的帮助@almalki(+1)!在我看来,唯一的问题是'全局名'请求'没有定义'在'return form'行。我不知道如何正确地返回信息..你有什么想法如何返回表单?我非常感谢你分享你的知识。谢谢! – 2013-02-21 18:54:24

1

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