基于字母表的分页(A-Z)

时间:2014-02-18 09:28:54

标签: python django pagination

我有一个简单的联系人应用程序,我想根据名字字母表对联系人列表进行分页。

这是我的views.py

def contacts(request):
    contact_list = Contact.objects.filter(user=request.user).order_by('first_name')
    pages = [contact_list.filter(first_name__istartswith=i) for i in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
    return render(request, 'contact/contact.html', {'contact_list': contact_list, 'pages': pages})

这是我的模板

{% for alphabet in pages %}
{% if alphabet %}
    <p>{{ alphabet }}</p>
    {% for contact in contact_list %}
    {% if contact in pages %}
    <ul>
        <li><a href="/contacts/{{ contact.id }}/">{{ contact.first_name }}</a></li>
    </ul>
    {% endif %}
    {% endfor %}
{% endif %}
{% endfor %}

此输出类似于

[<Contact: Steve>, <Contact: Su>]

Steve

Su

[<Contact: Ted>]

Ted

[<Contact: Zedd>]

Zedd

{{ alphabet }}打印一个列表。我应该写什么来打印字母表呢?

1 个答案:

答案 0 :(得分:0)

捕获上下文变量中的字母:

pages = [{"letter": i, "contacts": contact_list.filter(first_name__istartswith=i) } 
           for i in "ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
return render(request, 'contact/contact.html', {'pages': pages})   # why pass contact_list?

您的模板应简化为:

{% for alphabet in pages %}
  {% if alphabet.contacts %}
    <p>{{ alphabet.letter }}</p>
    {% for contact in alphabet.contacts %}
    <ul>
        <li><a href="/contacts/{{ contact.id }}/">{{ contact.first_name }}</a></li>
    </ul>
    {% endfor %}
  {% endif %}
{% endfor %}