如何在 Django 中按字母排序

How to sort by letter in Django

提问人:emin 提问时间:8/3/2023 最后编辑:emin 更新时间:8/3/2023 访问量:16

问:

在我的网站上,有不同的列表排列为 (a-e)、(e-j)、(j-o)、(o-t) 和所有列表。当用户点击这些列表中的任何一个时,我希望网站从数据库中检索数据,从所选字母范围内的标题开始。但是,我不是很熟悉如何实现此功能。谁能帮我解决这个问题?

索引:.html

<div class="widget-content">
    <h4>Sort by letter</h4>
        <ul class="widget-links">
            {% for letter_range in letter_ranges %}
                {% if selected_range == letter_range %}
                    <li><strong>{{ letter_range }}</strong></li>
                {% else %}
                    <li><a href="?range={{ letter_range }}">{{letter_range}}</a></li>
                {% endif %}
            {% endfor %}
        </ul>

views.py

def index(request):
    letter_ranges = ['All', 'a-e', 'e-j', 'j-o', 'o-t', 't-z']
    selected_range = request.GET.get('range', 'All')

    if selected_range == 'All':
        queryset = tabir.objects.filter(is_active=True)
    else:
        start_letter, end_letter = selected_range.split('-')
        queryset = tabir.objects.filter(title__istartswith__range=(start_letter, end_letter), is_active=True)

    context = {
        "tabirs": queryset,
        "current_date": datetime.now(),
        "selected_range": selected_range,
        "letter_ranges": letter_ranges,
    }
    return render(request, "ruya/index.html", context)

models.py

class tabir(models.Model):
    id = models.BigAutoField(primary_key=True)
    title = models.CharField(max_length=200)
    description = RichTextField()
    is_active = models.BooleanField(default=False)
    is_home = models.BooleanField(default=False)
    release_date = models.DateTimeField(null=False,blank=True) #default=datetime.date.today
    create_date = models.DateTimeField(editable = False, auto_now_add=True)#default=datetime.date.today
    slug = models.SlugField(null= False, blank=True,unique=True, db_index=True, editable=False)
html django if-语句

评论


答:

1赞 willeM_ Van Onsem 8/3/2023 #1

你可以在字段的下部 [Django-doc] 上工作:__range

from django.db.models.functions import Lower

letters = selected_range.split('-')
queryset = tabir.objects.alias(title_lower=Lower('title')).filter(
    title_lower__range=letters, is_active=True
)