我正在为我的网站在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))
答案 0 :(得分:0)
当模板准备就绪时,您实际上可以将其保存在事务和回滚中。这不是很有效,但至少它会起作用。
答案 1 :(得分:0)
featured.featureworklink_set.add(FeatureWorkLink(image=link))
会立即尝试在FeatureWork
和FeatureWorkLink
之间创建一个关系,这种情况不会发生,因为FeatureWork
的实例不存在数据库,你不能满足建立外键关系的谓词。
但最棒的是Django的Model
和ModelForm
实例在实际尝试提交数据之前不会验证外键关系。因此,使用未提及的,不存在的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()
到您的模型,将所有内容保存到数据库,不要寻找黑客。这样你就可以免费获得草稿。