社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

在django中对搜索结果进行排序

Frank • 3 年前 • 1736 次点击  

我有一个函数,返回一个查询集和一个带有结果的html文件,

def get_queryset(self): # new
        query = self.request.GET.get('q')
        sort = '-date'
        post_list = Post.objects.filter(
            Q(title__icontains=query) #| Q(title__icontains=query) another field
        ).order_by(sort)
        return post_list

表格:

<form class="form-inline my-2 my-lg-0" action="{% url 'search_results' %}" method="get">
      <input class="form-control" name="q" type="text" placeholder="חפש מאמרים">
      <button class="btn btn-outline-success my-sm-0" type="submit">חפש</button>
    </form>

在结果模板中,我希望有几个链接可以按日期、投票等进行排序。。。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131452
 
1736 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    3 年前

请不要允许任意排序:这是一个安全漏洞,因为用户可以根据文章作者的性别进行排序 Post ,这可能是您想要保护的数据。你应该列出一系列可接受的选择,因此:

def get_queryset(self):
    query = self.request.GET.get('q')
    sort = self.request.GET.get('order_by', '-date')
    if sort not in ['date', '-date', 'votes', '-votes']:
        sort = '-date'
    return Post.objects.filter(
        Q(title__icontains=query) | Q(title__icontains=query)
    ).order_by(sort)

然后,url应该如下所示:

<a href="{% url 'search' %}?q={{ query|urlencode }}&amp;order_by=-votes">votes</a>

具有 'search' 指向此视图的路径的名称。


笔记 :也许值得一看 django-filter  [GitHub] 基于 QueryDict 以更具陈述性的方式。

Işık Kaplan
Reply   •   2 楼
Işık Kaplan    3 年前

您可以编写一个小get表单,通过名为order的查询参数添加相关的order。

?order_by=-date
?order_by=score
?order_by=author

把这些带到视野中 request.GET.get("order_by")

或者您可以使用以下库:

https://django-filter.readthedocs.io/en/stable/ref/filters.html