【问题标题】:Edit Django Formwizard: Getting Initial Data编辑 Django Formwizard:获取初始数据
【发布时间】:2013-02-18 18:10:50
【问题描述】:

我正在尝试使用我的 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)

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


编辑:(2/18/13)

得到一个:

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

@sneawo 下面的回答解决了这个问题,但仍然没有传递初始数据,而是由向导创建新对象。


编辑:(2/19/13)

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],
        })

【问题讨论】:

  • 为什么在else条件下使用thing = Thing(user=request.user)
  • 哦,是的。我的错。但是,删除了该条件,现在有一个TypeError: __init__() takes exactly 1 argument (3 given)。在上面添加了详细信息。感谢您的任何想法!
  • 您能否也显示CreateWizard 类的代码。
  • @sneawo:添加了CreateWizard。感谢您的任何想法..
  • 感谢@sneawo TypeError 现在已经消失(+1 谢谢),但是我仍然无法将初始数据获取到表单中,以便我可以编辑对象。相反,由于某种原因,当我使用上述edit_wizard 视图时会创建一个新对象。社区的任何想法都非常感谢尝试克服这个 FormWizard 问题。谢谢!

标签: django edit wizard


【解决方案1】:

根据文档,对于 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,但您必须在 (done) 方法中再次进行用户权限检查。

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)

【讨论】:

  • 谢谢@almalki。将初始数据字典设置为字符串允许我将initial_dict 放入表单中。但是,会创建一个新实例,而不是修改原始实例。你能帮我理解为什么吗?谢谢!
  • 感谢您的帮助@almalki (+1)!在我看来,剩下的唯一问题是return form 行的global name 'request' is not defined。我不知道如何正确返回信息..你有任何想法如何返回表格吗?我真的很感谢你分享你的知识。谢谢!
  • @NickB 它工作正常,对吧?你可能会在改变的时候弄坏一些东西。这个异常发生在哪一步(查看)?
  • 谢谢@almalki。我已经能够将initial_data 放入表单中,但由于以下行,我无法正确编辑实例:return form(context=RequestContext(request), request=request)。在我看来,错误是global name 'request' is not defined edit_wizard。尝试提交表单以更新对象时发生错误。这似乎是唯一阻止我更新对象的事情。你有什么想法可以帮助我吗?非常感谢!
  • @NickB 我真的很困惑,如果'edit_wizard'是第一个视图并且有异常,你是如何获得带有初始数据的表单的?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2021-08-18
    • 2016-03-31
    • 2015-09-03
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多