【问题标题】:Form for multiple models多种型号的表格
【发布时间】:2013-06-23 04:59:14
【问题描述】:

假设我有两个模型:

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

按照 cmets 中的建议,我可以使用两种形式。但我没有看到在我的TopicCreate 视图中使用两种表单的任何简单方法——我应该重新实现所有属于获取表单的方法(至少)。

所以,我的问题是:

在 Django 中是否已经为我的要求实现了一些东西?还是有更好(更简单)的方法?

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

【问题讨论】:

  • 您可以在视图中组合两个模型形式。
  • 好问题,我从来没想过。通常会创建新表格。这对我来说好多了
  • @J.Ghyllebert,我没有看到将两种表单与基于类的视图一起使用的简单方法。看起来我应该重新实现get_form_classget_form 等。请告诉我,如果我错了并且存在更简单的方法。谢谢,无论如何,我会尝试你的建议。
  • 为此,我会切换到基于函数的视图,但要让它在 cbv 中工作,工作量太大了。
  • 不推荐使用基于函数的视图,不是吗?

标签: python django


【解决方案1】:

您可以为每个模型创建两个具有必填字段的单独表单。然后在一个 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() 和所有其他函数,而无需自己动手。

【讨论】:

  • 很好,但是我使用基于类的视图,而且,现在,我没有看到任何简单的方法可以在其中使用两种形式(我应该重新实现get_form_class,@987654326 @, 和别的)。你?如果是,请告诉我,那将非常酷。
  • @soon 哦!我还没有开始使用基于类的视图。快速搜索并没有提供任何简单的解决方案。基于类的视图可以有两种形式,但一次只能处理其中一种。可以在here 找到类似的问题。也许,将这两种形式合二为一会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
相关资源
最近更新 更多