Django字母索引

5 投票
5 回答
1502 浏览
提问于 2025-04-16 03:34

我想要一些建议,关于如何设计一个带有A到Z索引的网页。

就像这个链接:

http://www.bls.gov/bls/topicsaz.htm

我有一长串的对象,每个对象都有一个标题,我想按字母顺序展示,简单吧!

但是我想在页面上放一个A-Z的索引,并且用锚点链接到每个字母。我应该在模板里做这个吗?

我可能需要在模板中循环遍历所有对象,把当前字母存储为一个全局变量。然后检查每个对象是否以当前字母开头,等等等等。

这样做不太好,有没有更简单的方法我没想到呢?

也许我应该在Python代码里处理这个问题?

5 个回答

2

这段内容跟mp0int的回答类似,不过是在数据库层面上添加了index

  • 使用.extra()方法来给你获取对象的查询添加一个字母索引,比如:

.extra(select={'index': "SUBSTR(headline,1,1)"})

3

你可以使用 reqroup 模板标签来对项目进行分组...假设 headline 是你要索引的字段...首先,在你的视图中过滤你的对象,并为每个对象添加一个索引参数,以便进行分组:

objectList = SomeModel.objects.all()
for x in objectList:
    x.__setattr__('index', x.headline[0])// first letter of headline

Regroup 文档 提供了足够的信息来帮助你理解其余内容,但简单来说,就是通过索引进行分组,并将 item.grouper 作为索引链接...

5

在查看Django的模板标签时,我发现了一个很不错的方法{{ifchanged}},值得记下来以后用。

我的对象列表是按字母顺序传递到模板中的:

Objects.get.all().order_by('title')

然后在我的模板里,我这样做:

# loop through all objects
{% for obj in objs %}
  #display the letter only when it changes
  {% ifchanged obj.title.0 %}<h1>{{obj.title.0}}</h1>{% endifchanged%}
  # display the object
  <h2>obj.title</h2>
{% endfor %}

这段代码在模板里只用了一行,非常方便。

撰写回答