如何根据模型字段选择表单

How to choose form depending on model field

我有一个 Django 模型来定义内容页面,其中我有一个字段可以选择是否要在页面中显示某种形式。

现在我制作了第二张表格。我想根据 ContentPage 实例中填写的某些字段使用一个或另一个。

更具体地说,我坚持这部分:

class ViewContentPage(CreateView):
    model = ContentPage
    # What I'd like to do
    form_class = depending_on_some_ContentPage_field()

    # From here, overriden methods and stuff

问题是似乎无法访问 kwargsrequest 在 class 级别定义(以便根据从 kwargs 中提取的 slug 加载正确的 ContentPage 记录,然后从它的字段中确定要加载的表单)

我一直在思考不同的方法来实现类似的结果,研究让我找到了这个问题:Can I call a view from within another view?。我认为“将 FormViews 作为 ViewContentPage 中的子视图”将铺平道路,或者为在模板级别呈现的表单提供完全独立的视图...

上面 pseudo_code 中公开的内容是否可以通过其他方法实现?

编辑

正如@Alasdair 所推荐的那样,我在我看来重写了 get_form_class() 方法。看起来它做了我想要的,但是完全在 Django 本身的回溯的一点失败阻碍了我。

我使用的是 Django v1.8.3,引发异常的点在 django.core.handlers.base.py 第 132 行(回溯中的第一个)。例外情况是:

TypeError: 'instance' is an invalid keyword argument for this function

而这个异常的原因似乎在 django/db/models/base.py 480 行(回溯中的最后一个)。不知何故,这个 class (django.db.models.base.Model) 是 运行 即使 self = Error in formatting: RelatedObjectDoesNotExist: MyModelForForm2 has no page. 真的很混乱。

这不是我第一次看到回溯不会在我的源代码中的任何地方停止的错误,即使如此,更正源代码也会消除错误。但是,我仍然坚持如何在不修改 Django 本身的情况下更正此问题。

您可以覆盖 get_form_class 方法。在其中,您可以访问 self.request 并从 self.kwargs.

获取 slug
class ViewContentPage(CreateView):
    model = ContentPage

    def get form_class(self):
        # return correct class based on self.kwargs and self.request