问题描述
我想知道为什么我的 defaultdict(list)
将在我的views.py中测试时显示,但是当我去显示我的模板上的数据时,我什么都没有,甚至没有错误
任何建议?
这是我的views.py - confirm_list是我的defaultdict(list) p>
def confirmations_report(request,* args,** kwargs):
来自invest.models import投资,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 = {}
如果request.POST:
form = ConfirmationsForm(request.POST)
如果form.is_valid():
start_date = form.cleaned_data ['start_date']
end_date = form.cleaned_data ['end_date']
invest = Investment.objects.all()。 (contract_no =,maturity_date__range =(start_date,end_date))。order_by('financial_institution')
for i in investment:
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.pl a.get_primary_owner()。member.client.sin,
'type':i.product.code,
'purchase_amount':i.amount,
'purchase_date':i.start_date,
})
上下文['投资'] =投资
上下文['confirmlist'] = confirm_list
为key,值在confirm_list.items()中:
print key
上下文['inv'] =投资
如果request.POST.has_key('print_report_submit'):
上下文['show_report'] = True
上下文[' 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(),mime type ='application / pdf')
response ['Content-Disposition'] ='attachment; filename = unreceived-confirmations.pdf'
return response
else:
form = ConfirmationsForm()
上下文['form'] = form
return render_to_response('reports / admin / confirm_report.html',RequestContext(request,context))
但是当我这样做:
为key,值在confirm_list.items()中:
打印键,值
在我的模板如下:
{%extends'reports / admin / base.html'%}
{%load humanize%}
{%block report_html%}
< h3>未接收确认报告< / h3>
< form method =postaction =>
< 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 =submitvalue =查看报告>
< input type =submitname =print_report_submitvalue =打印报告/>
< / form>
{key 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:#,#>}]
pre>
解决方案这是因为Django模板语言。当您尝试循环使用字典项目时,
{%的键值,confirmlist.items%中的值
Django首先为
confirmlist ['items']
。因为这是一个defaultdict
,返回一个空列表。
这是一个残酷的骗子,我已经为了解决这个问题,请将defaultdict转换成字典,然后再将其添加到模板上下文中。
$ b$ b
上下文['confirmlist'] = dict(confirm_list)
或者,根据sebastien trottier在他的中的解释,设置
default_factory
至无
添加到模板上下文confirm_list.default_factory =无
上下文['confirmlist'] = confirm_list
I am wondering why my
defaultdict(list)
will show when I test it in my views.py but when I go to show the data on my template, I get nothing, not even an error.Any suggestions?
Here is my views.py - confirm_list is my defaultdict(list)
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))
But when I do:
for key, value in confirm_list.items(): print key, value
On my template like so:
{% 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 %}
I get nothing.
Here is a sample of the output I get when testing in the 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: #, #>}]
解决方案This happens because of the way the Django template language does variable lookups. When you try to loop through the dictionaries items,
{% for key, value in confirmlist.items %}
Django first does a dictionary lookup for
confirmlist['items']
. As this is adefaultdict
, an empty list is returned.It's a cruel gotcha, that I've been stung by as well!
To work around this problem, convert your defaultdict into a dictionary before adding it to the template context.
context['confirmlist'] = dict(confirm_list)
Or, as explained by sebastien trottier in his his answer to a similar question, set
default_factory
toNone
before adding to the template context.confirm_list.default_factory = None context['confirmlist'] = confirm_list
这篇关于我的defaultdict(list)不会显示在模板上,但在我看来的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!