我有一个用于定义内容页面的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
问题是似乎无法访问kwargs
或request
在类级别定义(为了根据从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本身的情况下纠正这个问题。
答案 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