2011-03-04 75 views
1

我正在为我的网站构建CMS的“预览”功能,该功能使用现有的前端模板呈现模型。这种模式有关联:如何用关联创建新的(未保存的)Django模型?

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

你为什么不只是添加:

预览= BooleanField()

到模型中,保存所有数据库和不看黑客。这样你可以免费获得草稿。

+0

是的,这实际上是我如何实现它。在实例保存之前,您无法使用预览模式。 – alalonde 2011-03-07 23:29:52

0

实际上,你可以把它保存在交易并在模板准备就绪时回滚。这不是很有效,但至少它会起作用。

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属性,直到收集所有数据为止,然后提供已提交的FeatureWork实例,以便模型表单集合可以满足引用完整性并最终被提交到数据库。