Python 多模型表格

Python 多模型表格,python,django,Python,Django,假设我有两个模型: class Topic(models.Model): title = models.CharField() # other stuff class Post(models.Model): topic = models.ForeignKey(Topic) body = models.TextField() # other stuff 我想创建一个包含两个字段的表单:Topic.title和Post.body。当然,我可以创建以下表单

假设我有两个模型:

class Topic(models.Model):
    title = models.CharField()
    # other stuff


class Post(models.Model):
    topic = models.ForeignKey(Topic)
    body = models.TextField()
    # other stuff
我想创建一个包含两个字段的表单:
Topic.title
Post.body
。当然,我可以创建以下表单:

class TopicForm(Form):
    title = forms.CharField()
    body = forms.TextField()
    # and so on
但是我不想重复代码,因为我已经在模型中有了
标题
正文
。我在找这样的东西:

class TopicForm(MagicForm):
    class Meta:
        models = (Topic, Post)
        fields = {
            Topic: ('title', ),
            Post: ('body', )
        }
    # and so on
另外,我想在基于类的视图中使用它。我的意思是,我想将视图写为:

class TopicCreate(CreateView):
    form_class = TopicForm

    # ...

    def form_valid(self, form):
        # some things before creating objects
正如评论中所建议的,我可以使用两种形式。但在我的
TopicCreate
视图中,我看不到任何使用两个表单的简单方法-我应该重新实现所有属于get表单的方法(至少)

所以,我的问题是: Django中是否已经为我的需求实现了一些东西?还是有更好(更简单)的方法


您知道在基于类的视图中使用两种表单的简单方法吗?如果是这样,请告诉我,它也可以解决我的问题。

您可以为每个模型创建两个单独的表单,其中包含必需的字段。然后在一个html元素中显示模板中的两个表单。这两个表格将分别呈现和提交。然后可以在视图中单独处理这些表单

class TopicForm(ModelForm):

    class Meta:
        model = Topic
        fields = ("title", ..)


class PostForm(ModelForm):

    class Meta:
        model = Post
        fields = ("body", ..)
鉴于:

form1 = TopicForm()
form2 = PostForm()
在模板中:

<form ...>
{{ form1 }}
{{ form2 }}
</form>

{{form1}}
{{form2}}

您可以轻松地使用form.save()和所有其他函数,而无需自己全部操作。

您可以在视图中组合两个modelforms。好问题,我从未想过会这样。通常创建新表单。这样做更好me@J.Ghyllebert,我看不出使用两个表单和基于类的视图的简单方法。看起来我应该重新实现
get\u form\u class
get\u form
,等等。请告诉我,如果我错了,存在更简单的方法。不管怎样,谢谢你,我会按照你的建议去做。为此,我会切换到基于函数的视图,只是要在cbv中工作太多了。基于函数的视图不受欢迎,不是吗?那很好,但我使用基于类的视图,而且,现在,我没有看到任何简单的方法在其中使用两个表单(我应该重新实现
get\u form\u class
get\u form
,以及其他)。是吗?如果是,请告诉我,那会很酷。@soon Ohk!我还没有开始使用基于类的视图。快速搜索并不能提供任何简单的解决方案。基于类的视图可以有两个表单,但一次只能处理其中一个表单。可以找到类似的问题。也许,将这两个表单合并到o中会更容易氖。