动态链Django表单

时间:2018-02-05 11:14:17

标签: django django-forms django-views

在Django 1.11应用程序中,我为用户创建了一个更新模型实例的大表单,但根据用户更改的内容,可能还有其他多种表单,我希望将其重定向到之后。

动态链接多个表单(动态工作流程)的最佳做法是什么?

我在这里找不到任何有用的Django文档或其他问题。

E.g。模型更新表格(极简化)视图:

def asset_edit(request, pk):
    asset = get_object_or_404(Asset, pk=pk)
    current_location_concat = "{} {} {}".format(asset.location_building, asset.location_room, asset.location_area)
    if request.method == "POST":
        form = EditAsset(request.POST, request.FILES, instance=asset)
            if form.is_valid():
                asset = form.save(commit=False)
                # setting some things...
                asset.save()
                new_location_concat = "{} {} {}".format(asset.location_building, asset.location_room, asset.location_area)

                if current_location_concat != new_location_concat:
                    check_relatives = True    # redirect to check_relatives form

                if asset.equipment_id:
                    if Asset.objects.filter(equipment_id=asset.equipment_id).count() > 1:
                        duplicate_assets = True    # redirect to check_duplicates form

                # if check_relatives and duplicate_assets:
                    # redirect to check_duplicates form and then on to check_relatives form

                return redirect("asset_detail", pk=asset.pk)

我知道我可以为我的check_duplicates表单添加一个新的URL,其中包含" next" (或类似的)参数,传递一个" next" check_duplicate视图映射到一个或多个其他表单的值(在这个例子中只是" check_relatives"并且在提交check_duplicates表单时重定向到此,但这是最佳做法吗?

特别是考虑到可能需要以这种方式链接的表单数量会变得非常大并且逻辑复杂!

1 个答案:

答案 0 :(得分:1)

我一直在使用formtool's WizardView,我也尝试过'stuff-everything-in-the-post-method'方法。

WizardView看起来非常适合您要做的事情。 例如,它允许您根据功能条件跳过工作流程中的步骤 - 从工作流程中删除这一部分逻辑,这使整个视图更易于阅读。

我发现为这些视图编写测试很痛苦,因为在测试时你必须考虑到WizardView自己的内部结构,但总的来说它肯定比编写1000行后方法更好(也许在BASIC中编写代码)然后)。