如何创建具有关联的新(未保存)Django模型?

时间:2011-03-04 20:52:51

标签: django django-models django-forms

我正在为我的网站在CMS中构建一个“预览”功能,该功能使用现有的前端模板来渲染模型。这个模型有一个关联:

class FeatureWork(models.Model):
    name = models.CharField(max_length=100)
    ...

class FeatureWorkLink(models.Model):
    feature_work = models.ForeignKey(FeatureWork)

在预览视图中,我正在尝试构建模型,以便在模板调用feature.featureworklink_set.all时返回关联的链接。由于两种模型都尚未保存,所有标准的Django表单技术似乎都没有了。

这是我到目前为止所做的,但是当我在管理器上调用add方法时它会爆炸,因为父级尚未保存:

form = FeatureWorkAdminForm(initial=request.POST)
featured = form.save(commit=False)
for link in request.POST['links'].split(","):
    featured.featureworklink_set.add(FeatureWorkLink(image=link))

3 个答案:

答案 0 :(得分:0)

当模板准备就绪时,您实际上可以将其保存在事务和回滚中。这不是很有效,但至少它会起作用。

答案 1 :(得分:0)

featured.featureworklink_set.add(FeatureWorkLink(image=link))会立即尝试在FeatureWorkFeatureWorkLink之间创建一个关系,这种情况不会发生,因为FeatureWork的实例不存在数据库,你不能满足建立外键关系的谓词。

但最棒的是Django的ModelModelForm实例在实际尝试提交数据之前不会验证外键关系。因此,使用未提及的,不存在的FeaturedWorkLink手动构建FeatureWork应满足您需要执行的任何数据呈现,这与您期望的内容相符:

 links = []
 form = FeatureWorkAdminForm(initial=request.POST)
 featured = form.save(commit=False)

 for link in request.POST['links'].split(","):
      links.add(FeatureWorkLink(image=link, feature_work=featured))

 # then somewhere in your templates, from the context

 {% for link in links %}
      <img src="{{ link.image }}" 
       title="Image for the featured work: '{{ link.feature_work.name }}'" />
 {% endfor %}

基本上,在收集数据以创建FeatureWork的过程中,您必须通过后续请求维护FeatureWorkLink个实例。这是您使用模型表单集的地方,但为集合的每个模型表单实例的FeatureWork属性提供未提交的feature_work,直到收集了所有数据的位置为止,然后,您可以在其中提供提交的FeatureWork实例,以便模型表单集可以满足参照完整性并最终提交到数据库。

答案 2 :(得分:0)

为什么不添加:

preview = BooleanField()

到您的模型,将所有内容保存到数据库,不要寻找黑客。这样你就可以免费获得草稿。