如何根据型号领域选择表格

时间:2015-12-18 12:42:54

标签: python django django-models django-forms

我有一个用于定义内容页面的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 在类级别定义(为了根据从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'是此函数的无效关键字参数

此异常的原因似乎在django/db/models/base.py第480行(追溯中的最后一个)。不知何故,即使self = Error in formatting: RelatedObjectDoesNotExist: MyModelForForm2 has no page.真的令人困惑,这个类(django.db.models.base.Model)也在运行。

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

1 个答案:

答案 0 :(得分:1)

您可以覆盖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