我的 defaultdict(list) 不会显示在模板上,但在我看来 [重复]

Posted

技术标签:

【中文标题】我的 defaultdict(list) 不会显示在模板上,但在我看来 [重复]【英文标题】:My defaultdict(list) won't show up on template but does in my view [duplicate] 【发布时间】:2012-05-29 03:48:40 【问题描述】:

可能重复:Django template can’t loop defaultdict

我想知道为什么我的defaultdict(list) 在我的views.py 中测试它时会显示,但是当我在我的模板上显示数据时,我什么也得不到,甚至没有错误。

有什么建议吗?

这是我的views.py - confirm_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))

但是当我这样做时:

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: #, #>]

【问题讨论】:

如果模板中什么都没有,那么打印列表时视图中会得到什么?此外,views.py 的缩进已关闭。 【参考方案1】:

这是因为 Django 模板语言 variable lookups 的方式。当您尝试遍历字典项目时,

% for key, value in confirmlist.items %

Django 首先对confirmlist['items'] 进行字典查找。由于这是defaultdict,因此返回一个空列表。

这是一个残酷的陷阱,我也被刺痛了!

要解决此问题,请将您的 defaultdict 转换为字典,然后再将其添加到模板上下文中。

context['confirmlist'] = dict(confirm_list)

或者,正如 sebastien trottier 在他的 answer to a similar question 中所解释的那样,设置 在添加到模板上下文之前,default_factoryNone

confirm_list.default_factory = None
context['confirmlist'] = confirm_list

【讨论】:

以上是关于我的 defaultdict(list) 不会显示在模板上,但在我看来 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

按最高项目号对 defaultdict(list) 进行排序

将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法

defaultdict(list) 将所有值连接到一个列表中

循环遍历 django 模板中的 defaultdict(list) 结构

将字典复制到 defaultdict

从字典的 defaultdict(list) 中删除 nan 值