Джанго сложная модель и шаблон - PullRequest
0 голосов
/ 04 июня 2010

Я перемоделирую свои объекты, используя отношения ManyToMany, используя "через", как указано здесь: текст ссылки

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 %}

Ответы [ 3 ]

1 голос
/ 04 июня 2010

То, что вы сделали с .all, это именно то, что я имел в виду - изначально оно было в двух местах: .all () и шаблон .all в шаблоне.

Причина вашей «ошибки» совершенно очевидна - компонентами является поле m2m до Product . Это то, что вы написали в своем коде. Данный компонент представляет собой набор продуктов, а не посредническую модель ReceiptComponent .

UPD : просто оставьте свои модели без изменений и используйте receiptcomponent_set из Receipt

0 голосов
/ 04 июня 2010

1) выглядит отлично! (подсказка для других пользователей: inline! = inlines; D

2) удаление .all вызывает исключение:

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>

Ok. Теперь он работает, но результатом компонента является Product. Unicode , а не ReceiptComponent. Unicode (который является дочерним для Product). Почему?

0 голосов
/ 04 июня 2010

1) Вы пробовали inlines ?

2) удалите .all из вашего шаблона, он вам не нужен. Может быть, вам также понадобится Компоненты = список (receive.components.all ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...