2012-05-22 24 views
3

可能重複:
Django template can’t loop defaultdict我defaultdict(列表)不會顯示在模板,但在我看來確實

我很奇怪,爲什麼我會defaultdict(list)當我測試顯示它在我的views.py中,但是當我在模板上顯示數據時,我什麼都沒有,甚至沒有發生錯誤。

有什麼建議嗎?

這裏是我的views.py - confirm_list是我defaultdict(名單)

def confirmations_report(request, *args, **kwargs): 
from investments.models import Investment, InvestmentManager 
from reports.forms import ConfirmationsForm 
from collections import defaultdict 
import ho.pisa as pisa 
import cStringIO as StringIO 
import os.path 
confirm_list = defaultdict(list) 
context = {} 

if request.POST: 
    form = ConfirmationsForm(request.POST) 
    if form.is_valid(): 
     start_date = form.cleaned_data['start_date'] 
     end_date = form.cleaned_data['end_date'] 
     investments = Investment.objects.all().filter(contract_no = "",maturity_date__range=(start_date, end_date)).order_by('financial_institution') 
     for i in investments: 
      confirm_list[i.financial_institution.pk].append({ 
       'fi':i.financial_institution, 
       'fi_address1': i.financial_institution.address1, 
       'fi_address2': i.financial_institution.address2, 
       'fi_city': i.financial_institution.city, 
       'fi_prov': i.financial_institution.state_prov, 
       'fi_country': i.financial_institution.country, 
       'fi_postal': i.financial_institution.postal, 
       'primary_owner': i.plan.get_primary_owner().member, 
       'sin': i.plan.get_primary_owner().member.client.sin, 
       'type': i.product.code, 
       'purchase_amount': i.amount, 
       'purchase_date': i.start_date, 
      }) 
      context['investments'] = investments 
     context['confirmlist'] = confirm_list 
     for key, value in confirm_list.items(): 
      print key, value 
     context['inv'] = investments 
    if request.POST.has_key('print_report_submit'): 
     context['show_report'] = True 
     context['mb_logo'] = os.path.join(os.path.dirname(__file__), "../../../media/images/mb_logo.jpg") 
     html = render_to_string('reports/admin/confirm_report_print.html', RequestContext(request,context)) 
     result = StringIO.StringIO() 
     pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result) 
     response = HttpResponse(result.getvalue(), mimetype='application/pdf') 
     response['Content-Disposition'] = 'attachment; filename=unreceived-confirmations.pdf' 
     return response 

else: 
    form = ConfirmationsForm() 

context['form'] = form 
return render_to_response('reports/admin/confirm_report.html', RequestContext(request, context)) 

但是當我做:

for key, value in confirm_list.items(): 
      print key, value 

在我的模板,像這樣:

{% extends 'reports/admin/base.html' %} 
{% load humanize %} 

{% block report_html %} 
<h3>Unreceived Confirmations Report</h3> 
<form method="post" action=""> 
<table> 
    <tr> 
     <td> 
      <strong> {{ form.start_date.label }}</strong> {{ form.start_date }} 
      <strong>{{ form.end_date.label }}</strong> {{ form.end_date }} 
     </td> 
    </tr> 
</table> 
<input type="submit" value="View Report"> 
    <input type="submit" name="print_report_submit" value="Print Report"/> 
</form> 
    {% for key, value in confirmlist.items %} 
     {{ key }} - {{ value }} 
    {% endfor %} 
{% endblock %} 

我什麼也沒得到。

這裏是輸出在views.py

33 [{'fi_address1': u'Scotiabank FAS', 'fi_country': u'Canada', 'fi_address2': u'20 Queen Street West, Suite 2600', 'fi_city': u'TORONTO', 'fi': <FinancialInstitution: NATIONAL TRUST>, 'fi_prov': u'Ontario', 'fi_postal': u'### ###', 'purchase_amount': Decimal('30000.00'), 'purchase_date': datetime.date(2011, 6, 27), 'type': u'GIC', 'sin': u'###/###/###', 'primary_owner': <Member: #, #>}] 
+1

如果您在模板中什麼都沒有,您在打印列表時會在視圖中看到什麼?此外,您的'views.py'的縮進是關閉的。 – murgatroid99

+0

添加了一個示例輸出 – TheLifeOfSteve

回答

6

出現這種情況是因爲Django模板語言確實variable lookups的方式進行測試時,我得到的一個樣本。當您通過字典項嘗試循環,

{% for key, value in confirmlist.items %} 

Django的第一確實爲confirmlist['items']字典查找。由於這是一個defaultdict,所以返回一個空列表。

這是一個殘酷的陷阱,我也被刺痛了!

要解決此問題,請在將defaultdict添加到模板上下文之前將其轉換爲字典。

context['confirmlist'] = dict(confirm_list) 

或者,由塞巴斯蒂安TROTTIER在他自己的解釋answer to a similar question,添加到模板上下文之前設置 default_factoryNone

confirm_list.default_factory = None 
context['confirmlist'] = confirm_list 
相關問題