同时使用sort&过滤QuerySet

时间:2011-06-16 23:34:45

标签: django django-templates django-urls

我有一个我希望能够排序和过滤的用户配置文件列表。

我已经能够通过手动输入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>

目前,如果我在(未分类,未经过滤的)人才页面上,并且我在结果上选择了一个过滤器,它将返回     talent/filter:filter。然后,如果我选择对结果进行排序,它(显然)会转到talent/sort:sort,删除之前的过滤器。

我想要完成的是,如果我当前正在使用talent/filter:filter并点击排序方法,则会转到talent/filter:filter/sort:sort,如果我已经对结果进行了排序(talent/sort:sort )并点击过滤器,它也会转到talent/filter:filter/sort:sort。我怎么做到这一点。谢谢。

2 个答案:

答案 0 :(得分:2)

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

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个网址组合为1,并使用GET参数来激活排序。

request.GET.get('sort',None)
....
request.GET.get('filter', None)
....

这些例子可能会使用更严格的一些,但这就是主意。希望这可以帮助。 乔

答案 1 :(得分:1)

尽管与django的关系略有不同,但是如果使用GET变量,用户指定的排序/过滤器的最佳方法。因此,您的网址会显示为:

/天赋/过滤器= FOO&安培;排序=酒吧

在您的视图中设置当前过滤器的上下文变量并排序,然后使用这些变量在模板中构建您的网址。

像: 字母顺序

如果你真的觉得有必要使用url捕获参数,你需要设置你的url来处理所有条件(排序集,过滤器集,既不设置,也都设置)。然后在你的模板中,你需要一堆if语句来选择正确的url和参数。

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