Django模板中的字典循环问题

Key*_*eyo 5 python django django-templates

我不确定为什么这个模板不会向页面呈现任何内容.我有什么明显的遗失吗?

视图:

@user_passes_test(is_staff)
def details_activity_log(request, project_id, template='projects/details_activity_log.html'):

    project = get_object_or_404(Project.objects.select_related(), pk=project_id)
    action_log = project.projectactionlog_set.all()

    log_group = defaultdict(list)

    for log in action_log:
        log_group[log.action_time.strftime('%y%m%d')].append(log)


    #import pdb; pdb.set_trace()

    return render_to_response(template, {
        'log_group'  : log_group,
        'project'    : project,
        'action_log' : action_log,
        'tab_5'      : 'active',
    }, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

log_group包含模型对象的dict,如下所示:

defaultdict(<type 'list'>, {'110614': [<ProjectActionLog: ProjectActionLog object>, ...]}) 
Run Code Online (Sandbox Code Playgroud)

模板:

   {% for key, log in log_group %}
      {% for action in log %}
        {{ action }}
        {{ action.action_time }}                    
        {{ action.user.first_name }}
        {{ action.message }}
        {{ action.object_name }}
      {% endfor %}
    {% endfor %}
Run Code Online (Sandbox Code Playgroud)

编辑 如果我只看过文档,我会看到答案.https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#for

然而,这是一个棘手的情况,因为当循环无法解压缩迭代器项时,模板不会抛出任何运行时错误.

Joh*_*ohn 8

更改

{% for key, log in log_group %}
Run Code Online (Sandbox Code Playgroud)

{% for key, log in log_group.items %}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是:`log_group.iteritems`.但在这种情况下,看起来他并没有使用`key`所以`itervalues`应该这样做. (3认同)

TM.*_*TM. 5

将for循环更新为:

{% for log in log_group.itervalues %}
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实需要key(您的示例模板未显示您使用它):

{% for key, log in log_group.iteritems %}
Run Code Online (Sandbox Code Playgroud)