2010-06-04 85 views
0

我「到」改造使用使用多對多關係,我的對象,因爲它是在這裏指導: link textDjango的複雜模型和模板

class Receipt(models.Model): 
    name = models.CharField(max_length=128) 
    (...) 
    components = models.ManyToManyField(Product, through='ReceiptComponent') 
    class Admin: 
    pass 

    def __unicode__(self): 
    return self.name 

    def url(self): 
    return self.id 

class ReceiptComponent(models.Model): 
    product = models.ForeignKey(Product) 
    receipt = models.ForeignKey(Receipt) 
    quantity = models.FloatField(max_length=9) 
    unit = models.ForeignKey(Unit) 
    class Admin: 
    pass 
    def __unicode__(self): 
    return unicode(self.quantity!=0 and self.quantity or '') + ' ' + unicode(self.unit) + ' ' + self.product.genitive 

它看起來不錯,但我有2個問題是:

1 )在管理管理面板中,與收據無法輕鬆連接=如果我必須添加新組件 - 我應該轉至組件並將組件連接到收據上 - 也許這是唯一的解決方案 - 但收據中會更直觀

2)使用模板,我不能打印:

views.py:

(...) 
def detail(request, receipt_id): 
    receipt = get_object_or_404(Receipt, pk=receipt_id) 
    components = receipt.components.all() 
    return render_to_response('receipt.html',{'receipt' : receipt, 'components' : components,} 
(...) 

receipt.html:

<h1>{{ receipt.name }}</h1> 
{% for component in components.all %} 
<div class='component'>{{ component }}</div> 
{% endfor %} 

回答

1

你對.all所做的一切正是我的意思 - 你最初在2個地方使用.all()和view模板。

您的'錯誤'的原因很明顯 - 組件是m2m字段到產品。這是你在代碼中寫的。這個組件是產品的集合,而不是中介模型ReceiptComponent

UPD:只要留下您的車型爲是,並使用receiptcomponent_setReceipt

+0

正確! components = receipt.receiptcomponent_set.all() 解決了這個問題 Python&Django不會讓我感到驚訝; D – 2010-06-05 06:52:50

0

1)您是否嘗試過inlines? 2)刪除模板中的.all,你不需要它。 也許你還需要 components = list(receipt.components.all())

0

1)看起來很完美! (提示爲其他用戶:直列=內聯; d

2!)除去。所有會導致異常:

Caught an exception while rendering: 'ManyRelatedManager' object is not iterable 

但我明白,質量好代碼,我應該從模板將其移動到代碼:

views.py:

def detail(request, receipt_id): 
    receipt = get_object_or_404(Receipt, pk=receipt_id) 
    components = receipt.components.all() 
    additionals = receipt.additionals.all() 

    return render_to_response('drinkbook/receipts/receipt.html',{'receipt' : receipt, 'components' : components, 'additionals' : additionals, }) 

模板:

h1>{{ receipt.name }}</h1> 
{% for component in components %} 
<div class='component'>{{ component }}</div> 
{% endfor %} 
{% if receipt.additionals %}Ponadto: 
{% for additional in additionals %} 
<div class='additional'>{{ additional }}</div> 
{% endfor %} 
{% endif %} 
<p>{{ receipt.desc|safe }}</p> 

好的。它現在可以工作,但組件的結果是Product。 unicode not ReceiptComponent。 unicode(這是產品的子)。爲什麼?

+0

奇怪。一個答案消失... – 2010-06-06 07:32:05

+0

否...; D答案上升; D – 2010-06-06 07:35:21