2011-03-04 76 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實例,以便模型表單集合可以滿足引用完整性並最終被提交到數據庫。