Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据模型字段选择表单_Python_Django_Django Models_Django Forms - Fatal编程技术网

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

Python 如何根据模型字段选择表单,python,django,django-models,django-forms,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()

我有一个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
请求
在类级别定义(根据从kwargs提取的slug加载适当的ContentPage记录,然后从其字段确定要加载的表单)

我一直在思考不同的方法来获得类似的结果,这项研究让我发现了这个问题:。我认为“将FormViews作为ViewContentPage中的子视图”将为在模板级别呈现的表单或完全独立的视图铺平道路

类似上面的伪_代码中公开的东西可以用其他方法实现吗

编辑 正如@Alasdair建议的那样,我在视图中重写
get\u form\u class()
方法。它看起来像是做了我想要的,但一个小小的失败,这完全是在Django本身的追溯站在我的方式

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

TypeError:“instance”是此函数的无效关键字参数

而这个异常的原因似乎出现在
django/db/models/base.py
第480行(回溯中的最后一行)。不知何故,这个类(django.db.models.base.Model)正在运行,即使
self=Error in formatting:RelatedObjectDoesNotExist:MyModelForForm2没有页面。
真让人困惑

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

您可以重写此方法。在它里面,您可以访问
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

好主意。我尝试实现它,根据字段直接返回所需的表单类,而无需任何
super()
调用。它触发了我的
TypeError:“instance”是此函数的无效关键字参数
,并且回溯在我的源代码中甚至没有停止。无论如何,谢谢你,我想这是正确的选择。我不知道你为什么会得到
TypeError
,而没有看到回溯。您不必在
get\u form\u class
中调用
super()。只是为了不要忘记。无论如何,我会找到一种方法来防止这个错误。天哪,几乎2个小时被卡住了,因为在
get\u form\u class()
中,我返回的是模型实例而不是表单!:-$在发现这个漏洞后,你的建议很有魅力!非常感谢你的帮助。顺便说一句,更新我的问题似乎和。。。xDI不鼓励使用“子视图”方法。因为您使用的是Python,所以可以从另一个视图中调用基于类的视图,但我不认为我会推荐这种方法。自定义基于类的视图的功能的最佳方法是重写适当的方法或属性。