多个模型的表格

时间:2013-06-26 07:02:33

标签: 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.titlePost.body。当然,我可以创建以下表单:

class TopicForm(Form):
    title = forms.CharField()
    body = forms.TextField()
    # and so on

但我不想复制代码,因为我在模型中已经有titlebody。我正在寻找这样的事情:

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视图中使用两种形式的简单方法 - 我应该重新实现所有方法属于获取形式(至少)。

所以,我的问题是:

Django中是否已根据我的要求实现了一些功能?或者有更好(更简单)的方式吗?

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

1 个答案:

答案 0 :(得分:2)

您可以为每个模型创建两个具有必填字段的单独表单。然后在一个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>

您可以轻松使用form.save()和所有其他功能,而无需自己完成。