【问题标题】:Show multiple django forms from the one view and extending with inheritance从一个视图显示多个 django 表单并通过继承进行扩展
【发布时间】:2015-08-03 05:25:34
【问题描述】:

假设我有以下模型:

class Revision:
    content = models.TextField()
    article = models.ForeignKey('Article', null=True)

class Article:
    title = models.CharField(max_length=64)
    revision = models.OneToOneField('Revision', null=True)

我想要为一篇文章创建编辑页面。我为两者创建了ModelForms。我已经开始编写CreateViewUpdateView,但不确定如何在每个视图中包含这两个表单(然后将其传递给模板并呈现为<form>)。

我发现大多数结果的目标是创建两个单独的 HTML <form>s 和单独的提交按钮,在一个视图中动态选择不同的表单,或者创建一个带有字段集的表单数组。相反,我希望在一个<form> 中显示两个ModelForm,以便在我设计的示例中(是的,标题应该在修订版中,但不是)我可以同时更改标题和内容一次。

据我所知,我需要以某种方式手动将这两个表单添加到上下文数据中,然后当用户提交时,绑定每个表单(通过将 POST 参数传递给构造函数)并检查它们的有效性。我可以从头开始摸索,但想知道首选方式,也许是现有的基于通用类的视图。哪些方法最好重载以注入所需的功能?通用视图不应该用于这么复杂的事情(尽管对我来说似乎很简单)?

假设我再介绍第三种模型:

class Page:
    slug = models.CharField(max_length=64)
    article = models.OneToOneField('Article', null=True)

现在我想要创建和编辑Page 的新视图。继承 Article 的视图,我想添加一个表单来允许修改 slug。我提出这个是因为我想要一个解决上面Article 视图的解决方案,它足够强大,可以在不重复代码的情况下处理聚合。我想这种情况很常见,我希望有一个我错过的简单解决方案。

【问题讨论】:

    标签: django django-forms django-views django-class-based-views


    【解决方案1】:

    如果我能很好地理解你的情况。这是一个常见的陷阱。您可以在单个<form> 下拥有任意数量的表单和模型表单。如果有命名冲突问题,可以使用prefix。然后,您可以这样处理发布的数据:

    if request.method == 'POST':
        form_revision = RevisionForm(request.POST)
        form_article = ArticleForm(request.POST, prefix='article')
        if form_revision.is_valid() and form_article.is_valid():
            article = form_article.save()
            revision = form_revision.save(commit=False)
            revision.article = article
            revision.save()
            # etc. etc. do whatever you like with your models
    

    编辑:根据您的评论要求,如果它是基于类的视图,则差别不大:

    class ContentNodeEditView(NodeView):
        def post(self, request, **kwargs):
            # ...
    

    出于各种原因,我也将添加成员,我相信您稍后会感激的:

        form_revision_class = RevisionForm
    

    然后将它们用作:

            form_revision = form_revision_class(request.POST)
    

    【讨论】:

    • 谢谢。您能说出如何在基于类的视图的上下文中执行此操作吗?我应该使用通用视图(我本以为会支持像我这样简单的情况)还是从头开始构建自己的视图?理想情况下,我还想通过继承添加新表单而不重写整个视图。
    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多