【发布时间】: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.title 和Post.body。当然,我可以创建如下表单:
class TopicForm(Form):
title = forms.CharField()
body = forms.TextField()
# and so on
但我不想重复代码,因为我已经在模型中有 title 和 body。我正在寻找这样的东西:
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_class、get_form等。请告诉我,如果我错了并且存在更简单的方法。谢谢,无论如何,我会尝试你的建议。 -
为此,我会切换到基于函数的视图,但要让它在 cbv 中工作,工作量太大了。
-
不推荐使用基于函数的视图,不是吗?