django观点:传递字典

时间:2014-02-16 11:46:38

标签: python django templates views

我从Django开始(来自CodeIgniter),一切都很混乱......

我想通过pub_date订购我的博客帖子,我希望将它们显示在按月+年分组的模板中。

我试过这个,但显然它不起作用......而且我对Python + Django的了解非常糟糕,我不明白为什么不这样做。

def index(request):
    blogs = Blog.objects.order_by('-pub_date')
    blogs_per_date = {}
    for blog in blogs:
        blogs_per_date[blog.pub_date.month + '-' + blog.pub_date.year] = blog
    context = {'blogs': blogs_per_date}
    return render(request, 'layout.html', context);

这是我对一个对象的尝试:

def index(request):
    blogs = Blog.objects.order_by('-pub_date')
    blogs_per_date = new object
    for blog in blogs:
        blogs_per_date.blog.(pub_date.month + ' ' + blog.pub_date.year) = blog
    context = {'blogs': blogs_per_date}
    return render(request, 'layout.html', context);

1 个答案:

答案 0 :(得分:3)

您可以使用模板中的regroup tag来绕过此问题。

{% regroup blogs by pub_date as blogs_by_date %}

<ul>
{% for blog in blogs_by_date %}
    <li>{{ blog.grouper }}
    <ul>
        {% for item in blog.list %}
          <li>{{ item }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

您现在的观点很简单:

def index(request):
    objects = Blog.objects.order_by('-pub_date')
    return render(request, 'layout.html', {'blogs': objects})

如果要在视图中执行此操作,则需要创建一个字典,其中每个键都是日期对象,值是博客对象列表。这样的事情会起作用:

from collections import defaultdict

def index(request):
    by_date = defaultdict(list)
    for obj in Blog.objects.order_by('-pub_date'):
        by_date[obj.pub_date].append(obj)
    return render(request, 'layout.html', {'blogs': by_date})

现在,在您的layout.html中,您有:

<ul>
{% for key,items in blogs.iteritems %}
    <li>{{ key }}
        <ul>
            {% for item in items %}
            <li>{{ item }}</li>
            {% endfor %}
        </ul>
    </li>
{% endfor %}
</ul>