python - 如何根据模型领域选择形式

标签 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 内的 subview ”会铺平道路,或者为在模板级别呈现的表单提供完全独立的 View ......

可以通过其他方法实现类似上面伪代码中公开的内容吗?

编辑

正如 @Alasdair 所推荐的,我覆盖 get_form_class()我认为的方法。看起来它满足了我的要求,但是回溯完全在 Django 本身中的一个小故障阻碍了我。

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

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

而这个异常的原因似乎在 django/db/models/base.py第 480 行(回溯中的最后一个)。不知何故,这个类(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

关于python - 如何根据模型领域选择形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34355991/

相关文章:

Python 数据库 api : fetchone vs fetchmany vs fetchall

python - 通过 tkinter 条目将数据从列表写入文件

python - 如何在 PostgreSQL 中将长整数 NUMERIC 转换为位字符串?

python - Django 的模型保存流程

Python 轮子反依赖

python - 尝试使用 django 运行 dsample 项目时出错

python - 通过 Django REST API 删除对象

python - Django 查询集 : All Model1 objects where a Model2 exists with a model1 AND the given user

django - 如何测试Django自定义模型字段?

当前时间介于两个 TimeField 值之间时的 Django 过滤器