2013-10-11 4 views
0

У меня возникли проблемы с поиском способа печати вычисленных данных в шаблон. Я постараюсь лучше описать свою ситуацию. У меня есть модель под названием дивиденд:печать вычисленных данных в шаблоне

class Dividend(models.Model): 
    date = models.DateField('pay date') 
    amount = models.FloatField(validators=[MinValueValidator(0.001), MaxValueValidator(1000000000000000.0)]) 
    price = models.FloatField('price per share', 
           validators=[MinValueValidator(0.001), MaxValueValidator(1000000000000000.0)]) 

таблица данных дивидендов выглядит следующим образом:

Date Dividend Price 
Sept. 26, 2013 $0.8 $24.75 
June 26, 2013 $0.7 $24.74 
March 26, 2013 $0.6 $23.59 
Dec. 13, 2012 $0.4 $19.18 
Sept. 26, 2012 $0.1 $20.66 

Я хочу добавить процент того, как был поднят каждый дивидендов (если он был). Так что-то вроде этого:

Date Dividend Price 
Sept. 26, 2013 $0.8 (+12,5%) $24.75 
June 26, 2013 $0.7 (+14,28%) $24.74 
March 26, 2013 $0.6 (+50%)  $23.59 
Dec. 13, 2012 $0.4 (+300%) $19.18 
Sept. 26, 2012 $0.1   $20.66 

Как это сделать? У меня есть данные в списке, потому что я добавляю некоторые дивиденды, которые я не хочу вставлять в db. Поэтому у меня есть список объектов дивидендов. В принципе, я хотел бы рассчитать это процентное изменение в представлении и добавить его в качестве другого параметра для каждого дивиденда.

for dividend in dividend_list: 
    dividend.change = ...calculation... 

и чем просто добавить его в моем шаблоне

{% for dividend in stock.dividend_set.all|order_by:"date" %} 
    <tr> 
     <td>{{ dividend.date }}</td> 
     <td>${{ dividend.amount }} ({{ dividend.change }}%)</td> 
     <td>${{ dividend.price }}</td> 
    </tr> 
{% endfor %} 

Но я не могу это сделать, потому что нет никаких изменений модели поля в дивидендах. Я храню в новом QueryDict, где ключ будет divend.id и изменение процентного значения. Но я не могу сделать query_dict [divend.id] в шаблоне. Итак, каков наилучший способ сделать это? Прошу прощения за такой тривиальный вопрос, но я не знаю, что искать. Извините за неудовлетворительное название, я изменю его, если придумаю что-нибудь более описательное после ваших ответов.

ответ

1

Вы можете добавить произвольные данные в экземпляры в представлении, не требуя, чтобы они были полями модели. Это нормально:

for dividend in dividend_list: 
    dividend.change = ...calculation... 

Просто убедитесь, что вы передаете dividend_list в контекст шаблона. Используете ли вы классные представления или функциональные представления? Для представлений на основе классов сделайте это в get_context_data и добавьте это к возвращаемому значению. Для функциональных представлений, поставить модифицированную dividend списка (больше не ленивая оценивали QuerySet) в словаре аргумента:

return render(template_name, {'dividend_list': dividend_list}) 

Тогда итерация над ним в шаблоне.

{% for dividend in dividend_list %} 
    <tr> 
     <td>{{ dividend.date }}</td> 
     <td>${{ dividend.amount }} ({{ dividend.change }}%)</td> 
     <td>${{ dividend.price }}</td> 
    </tr> 
{% endfor %} 

Вы также можете написать метод на моделях дивидендных сделать расчет, а затем вызвать его в петле шаблона, или даже написать собственный тег шаблона для отображения дивиденда.

Кроме того, вы действительно не хотите использовать FloatField для представления денег. Вместо этого используйте DecimalField.

+0

Thank! Извините, я использовал данные базы данных в шаблоне. Такая глупая ошибка. Спасибо за совет DecimalField, я понял слишком поздно, и я ленив, чтобы переписать его сейчас. Но так как ты это указал, я тоже. – Lucas03

Смежные вопросы