首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多模型形式

多模型形式
EN

Stack Overflow用户
提问于 2013-06-26 07:02:33
回答 1查看 305关注 0票数 1

假设我有两个模型:

代码语言:javascript
复制
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。当然,我可以创建以下表单:

代码语言:javascript
复制
class TopicForm(Form):
    title = forms.CharField()
    body = forms.TextField()
    # and so on

但是我不想重复代码,因为我已经在模型中使用了titlebody。我在找这样的东西:

代码语言:javascript
复制
class TopicForm(MagicForm):
    class Meta:
        models = (Topic, Post)
        fields = {
            Topic: ('title', ),
            Post: ('body', )
        }
    # and so on

另外,我想在基于类的视图中使用它。我的意思是,我想写成:

代码语言:javascript
复制
class TopicCreate(CreateView):
    form_class = TopicForm

    # ...

    def form_valid(self, form):
        # some things before creating objects

正如评论中所建议的那样,我可以使用两种形式。但是我看不到在TopicCreate视图中使用两种表单的任何简单方法--我应该重新实现属于获取表单的所有方法(至少)。

所以,我的问题是:

在Django中是否已经为我的需求实现了什么?还是有更好(更简单)的方法?

你知道在基于类的视图中使用两种形式的简单方法吗?如果是这样的话,告诉我,它也能解决我的问题。

EN

回答 1

Stack Overflow用户

发布于 2013-06-26 07:21:41

您可以为每个模型创建两个具有所需字段的单独表单。然后在一个html元素中的模板中显示这两个表单。这两个表单都将被呈现,然后单独提交。然后,可以在视图中单独处理表单。

代码语言:javascript
复制
class TopicForm(ModelForm):

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


class PostForm(ModelForm):

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

考虑到:

代码语言:javascript
复制
form1 = TopicForm()
form2 = PostForm()

在模板中:

代码语言:javascript
复制
<form ...>
{{ form1 }}
{{ form2 }}
</form>

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17313558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档