【问题标题】:Formwizards for editing in Django用于在 Django 中进行编辑的表单向导
【发布时间】:2011-02-04 17:52:16
【问题描述】:

我正在制作一个 webapp,这个 webapp 需要有一个表单向导。该向导由 3 个 ModelForms 组成,并且可以完美运行。但我需要第二种形式是“编辑形式”。也就是说,我需要它是一个传递实例的表单。

如何使用表单向导做到这一点?你如何传递一个模型的实例?我看到 FormWizard 类有一个 get_form 方法,但是没有记录的方法可以使用 formwizard 来编辑/查看数据吗?

【问题讨论】:

    标签: python django django-formwizard


    【解决方案1】:

    您可以在视图中使用 formwizard 类并在那里传递初始值,例如:

    def edit(request):
        initial = {0: {'field1':'value1'}}
        return FormWizard([form, some_other_form], initial=initial)
    

    其中 initial 应该是一个字典,其键等于步骤,值是数据字典,就像通常的形式一样。

    【讨论】:

    • 确定吗?我已经尝试过了,但它失败了。您收到一条错误消息:“'EditingForm' 对象不可调用”。
    • 呃,我的错,你不能在那里扔实例:/更新了我的答案
    • 我不认为中间件喜欢“返回 FormWizard”的东西,因为 formWizards 没有 status_code 并且在某些时候会检查 status_code == 400。我在尝试时遇到错误这个
    【解决方案2】:

    在 Django 1.4 中,您可以执行以下操作:

    def edit(request):
        initial = {
           0: {'subject': 'Hello', 'sender': 'user@example.com'},
           1: {'message': 'Hi there!'}
           }
        wiz = FormWizard([form1,form2,form3],initial_dict = initial)
        return wiz(request)
    

    【讨论】:

      【解决方案3】:

      我认为有几种方法,具体取决于您必须传递的数据有多复杂。

      您可以按照此处的说明进行操作:https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#providing-initial-data-for-the-forms 并创建一个初始字典,您将其传递给 urls.py 中的视图,如下所示:

      >>> initial = {
      ...     '0': {'subject': 'Hello', 'sender': 'user@example.com'},
      ...     '1': {'message': 'Hi there!'}
      ... }
      >>> wiz = ContactWizard.as_view([ContactForm1, ContactForm2], initial_dict=initial)
      

      您的另一个选择是覆盖 get_initkwargs 并将逻辑放入其中(参见 Django 代码:https://github.com/django/django/blob/master/django/contrib/formtools/wizard/views.py)。

      最后,如果你需要根据之前表单的输入提供对象,那么它会变得相当复杂,因为 get_initkwargs 是一个类方法,并且在启动向导时需要传递初始字典。但是,您可以通过覆盖 get_form_kwargs 来做到这一点:

      def get_form_kwargs(self, step=None):
          kwargs = {}
          if step != '0':
              your_field = self.get_cleaned_data_for_step('0')['your_field']
              # logic for getting object based on field goes here
              kwargs.update({'object': object,})
          return kwargs
      

      然后您可以使用表单的 init 方法根据您在 kwargs 中传递的对象设置初始值。我经常使用最后一段代码,但并没有真正使用过之前的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-24
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 2010-12-15
        • 2020-07-25
        • 1970-01-01
        相关资源
        最近更新 更多