Django 表单向导调度程序

Posted

技术标签:

【中文标题】Django 表单向导调度程序【英文标题】:Django form wizard dispatcher 【发布时间】:2014-08-28 14:59:09 【问题描述】:

我有一个两页长的表格。虽然,第一页提出了一个基本问题,并且根据答案,它需要重定向到要填写的三个表格之一,然后提交。我创建了一个图表来帮助说明:

我正在使用 django 表单向导,但我不知道如何构建我的视图以合并这种类型的逻辑。

有人可以帮我开始吗? 最好展示一些需要在django-form SessionWizardView中执行的代码。

提前致谢。

【问题讨论】:

要么尝试覆盖 get_form() 方法以返回第二步的预期形式。或者将所有 3 个表单添加为步骤并使用 condition_dict 和可调用跳过不需要的步骤。 【参考方案1】:

如果你只依赖前一个表单中的数据,则不需要覆盖 get_form,你可以使用 condition_dict,在初始化 WizardView 时通过自定义 ID 映射表单。

我不喜欢在 urls.py 中定义 WizardView 的内容过多,所以我将 WizardView 包装在标准视图函数中,并将普通视图函数放在 urls.py 中。

    def buy_cart_wizard_view_wrapper(request):

        con_dict = FORM_ID_BILLING_ADDRESS_PICK: db_funcs.check_wizard_has_addresses_buy_cart,
                    FORM_ID_BILLING_ADDRESS: db_funcs.check_wizard_create_billing_pick_buy_cart,
                    FORM_ID_SHIPPING_ADDRESS_PICK: db_funcs.check_wizard_has_addresses_shipping_pick_buy_cart,
                    FORM_ID_SHIPPING_ADDRESS: db_funcs.check_wizard_create_shipping_pick_buy_cart,
                    FORM_ID_SAVED_BUSINESS_PAYMENT_PICK: db_funcs.check_wizard_has_payments_buy_cart,
                    FORM_ID_SAVED_BUSINESS_PAYMENT: db_funcs.check_wizard_create_payment_pick_buy_cart,
        

        form_list = [(FORM_ID_BILLING_ADDRESS_PICK, accounts_forms.AddressPickerForm),
                 (FORM_ID_BILLING_ADDRESS, accounts_forms.BillingAddressForm),
                 (FORM_ID_SHIPPING_ADDRESS_PICK, accounts_forms.AddressPickerForm),
                 (FORM_ID_SHIPPING_ADDRESS, accounts_forms.AddressForm),
                 (FORM_ID_SAVED_BUSINESS_PAYMENT_PICK, accounts_forms.SavedBusinessPmtPickerForm),
                 (FORM_ID_SAVED_BUSINESS_PAYMENT, accounts_forms.SavedBusinessPmtBuyCartForm),
                 ]

        return BuyCartWizardView.as_view(form_list,condition_dict=con_dict, initial_dict=ini_dict)(request)

然后是上一个表单的条件检查示例,'

def check_wizard_create_payment_pick_buy_cart(wizard):
    """
    Check if the previous form has an address selected
    """
    cleaned_data = wizard.get_cleaned_data_for_step(FORM_ID_SAVED_BUSINESS_PAYMENT_PICK) or 
    create_new_payment_ind = cleaned_data.get(FORM_FIELD_NAME) or ''
    if create_new_payment_ind != '':
        return True
    else:
        return False

返回 True 以将表单显示为下一步,返回 False 以跳过表单并移至之后的表单或完成(如果表单外)。

【讨论】:

这非常有帮助!我今天会试试你的方法

以上是关于Django 表单向导调度程序的主要内容,如果未能解决你的问题,请参考以下文章

如何修改django-celery web界面进行周期性调度

使用 repath 参数的 Django url 调度程序

APS调度程序无缘无故引发异常django

Django URL 调度程序示例 - 将 url 从视图传递到另一个视图

Celery Beat 调度程序不会在 Django 中执行我的任务

如何在 Django 中动态调度任务?