Django 在查询集上同时使用排序和筛选

Django 在查询集上同时使用排序和筛选,django,django-templates,django-urls,Django,Django Templates,Django Urls,我有一个可以排序和筛选的用户配置文件列表 我已经能够通过手动输入URL来手动完成这项工作,但是我还无法对模板页面进行编码,以允许以前应用的过滤器或排序的持久性。下面是我目前拥有的url和模板代码- # in urls url(r'^talent/filter\:(?P<position>[A-Za-z]+)/sort\:(?P<sort>[A-Za-z]+)$', 'talent_filter', name='talent_filter_sort'), url(r'^ta

我有一个可以排序和筛选的用户配置文件列表

我已经能够通过手动输入URL来手动完成这项工作,但是我还无法对模板页面进行编码,以允许以前应用的过滤器或排序的持久性。下面是我目前拥有的url和模板代码-

# in urls
url(r'^talent/filter\:(?P<position>[A-Za-z]+)/sort\:(?P<sort>[A-Za-z]+)$', 'talent_filter', name='talent_filter_sort'),
url(r'^talent/filter\:(?P<position>[A-Za-z]+)/$', 'talent_filter', name='talent_filter'),
url(r'^talent/sort\:(?P<sort>[A-Za-z]+)/$', 'talent_sort', name='talent_sort'),
url(r'^talent/$', 'talent', name='talent'),

# in template
<ul>
    <li>SORT BY:</li>
    <li><a href = "{% url talent_sort sort='alphabetical'%}">Alphabetical</a></li>
    ...
</ul>
<ul>
    <li><a href = '{% url talent_filter position=position%}'>{{ position }}</a></li>
    ... 
</ul>
当前,如果我在未排序、未筛选的人才页面上,并且我在结果上选择了一个过滤器,它将返回 人才/筛选:筛选。然后,如果我选择对结果进行排序,它显然会转到人才/排序:排序,删除以前的过滤器


我想完成的是,如果我当前使用的是人才/筛选:筛选并单击排序方法,它将转到人才/筛选:筛选/排序:排序,如果我已经对结果进行了排序人才/排序:排序并单击筛选,它还将带我到人才/筛选:筛选/排序:排序。我将如何做到这一点。谢谢。

我认为实现这一点的一种方法是在会话中存储一个标志,指示排序或筛选应该是什么。例如,下面类似的内容可用于保存排序选择的状态

request.session['TALANT_SORT'] = "alphabetical"
request.session['TALENT_FILTER'] = "top_ten" 
然后,您的视图可以检查会话密钥是否存在,并相应地应用过滤器

qs = models.MyModel.objects.all()

sort = request.session.get('TALENT_SORT', None)
if sort in ["alphabetical", "created_date"]:
    qs = qs.order_by(sort)

myfilter = request.session.get("TALENT_FILTER", None)
if myfilter in ["top_ten","bottom_ten"]:
    qs = qs.filter( .... ) 

....
然后,排序和筛选可以在请求之间保持

如果要删除排序或筛选器,则可能可以根据某些用户操作删除视图中的会话键:

try:
    del request.session['TALENT_SORT']
    del request.session['TALENT_FILTER']
except KeyError: 
    pass 

此外,根据您的需求,您可以考虑将2个URL组合为1,并仅使用GET参数来激活排序。p>

request.GET.get('sort',None)
....
request.GET.get('filter', None)
....
这些例子可能需要更严格的要求,但这就是想法。希望这有帮助。
Joe

尽管有点反对django的所有内容,但如果要使用GET变量,最好的方法是使用用户指定的排序/过滤器。因此,您的URL将显示为:

/人才/?过滤器=foo&sort=bar

在视图中,为当前过滤器设置上下文变量并进行排序,然后使用这些变量在模板中构建URL

比如: 按字母顺序

如果您真的觉得有必要使用url捕获的参数,那么您需要设置url以处理所有条件排序集、筛选集、均不设置和均设置。然后在模板中,需要一组if语句来选择正确的url和参数


正如我所说,使用GET参数可以更好地处理这种情况。

是否希望这些已排序和筛选的视图具有书签功能?换句话说,您希望用户能够像这样键入URL吗?这两种方式都不重要。我希望以RESTful方式实现同样的目标-@elf,正如您提到的“bookmarkable”。还有其他的解决方案吗?来自一个RESTful的宇宙,David的参数似乎是读取活动的参数,因此正确地属于GET部分。i、 在URL中的“?”后面加上e。你能举个例子/如何做以下事情吗:在你的视图中,为你的当前过滤器设置上下文变量,然后进行排序,然后使用这些变量在模板中构建你的URL。大卫:乔的回答正是这样做的。