Django Generic object_list分页。添加而不是替换参数

时间:2010-10-08 14:18:54

标签: django pagination django-generic-views

我在使用django通用object_list函数的分页时遇到了一些麻烦,但这并不足以“弥补”我的愚蠢。

我正在尝试使用页面编号和类别的可选参数进行列表。 urls.py中的url如下所示:

url(r'^all/(?:(?P<category>[-\w]+)/page-(?P<urlpage>\d+))?/$', views.listing, ),

class和urlpage参数是可选的,因为额外的“(?:)?”在他们周围,这很好地工作。 views.listing是一个看起来像这样的包装函数(我不认为这是我的问题出现的地方):

def listing(request,category="a-z",urlpage="1"):
extra_context_dict={}
if category=="a-z":
    catqueryset=models.UserProfile.objects.all().order_by('user__username')
elif category=="z-a":
    catqueryset=models.UserProfile.objects.all().order_by(-'user__username')
else:
    extra_context_dict['error_message']='Unfortunately a sorting error occurred, content is listed in alphabetical order'
    catqueryset=models.UserProfile.objects.all().order_by('user__username')
return object_list(
                    request,
                    queryset=catqueryset,
                    template_name='userlist.html',
                    page=urlpage,
                    paginate_by=10,
                    extra_context=extra_context_dict,
                    )

在我的模板userlist.html中,我的链接看起来像这样(这是我认为真正的问题所在):

{%if has_next%}
  <a href=page-{{next}}>Next Page> ({{next}})</a>
{%else%}

链接会向网址添加另一个页面参数,而不是替换我的网址中的网页参数。网址最终看起来像“/ all / a-z / page-1 / page-2 /

发生这种情况并不奇怪,但是没有页面作为可选参数实际工作,Django取代了网页的旧页面部分。

我更喜欢这种DRYer(至少我认为是这样)的解决方案,但似乎无法让它运转起来。 任何提示如何通过更好的urls.py或模板标签解决这一问题将非常感激。

(也请原谅非母语英语和动态翻译代码。如果这是一个好的或无根据的堆栈溢出问题的任何反馈也很乐意)

3 个答案:

答案 0 :(得分:1)

你在这里使用相对URL - 所以它与Django没什么关系。您可以将链接替换为:

<a href="/all/a-z/page-{{ next }}">Next Page> ({{ next }})</a>

并且一切都会很好,除非您的模板中有一个脆弱的链接,一旦您更改urls.py就会中断,除非{{1},否则它将无效碰巧是category

相反,请使用Django的内置url标记。

a-z

要完成这项工作,您必须将您的类别传递到您在视图代码的第一行创建的<a href="{% url views.listing category next %}">Next Page> ({{ next }})</a>

extra_context_dict

答案 1 :(得分:0)

/all/a-z/page-1/page-2/源中出现的内容或链接带您到达的位置?我的猜测是浏览器将字符串“page-2”附加到当前URL。您应该从包含/的网址开始,以便说明完整路径。

您应该将该类别添加到extra_context并执行:

 <a href="/all/{{category}}/page-{{next}}">next page ({{next}})</a>

答案 2 :(得分:0)

“而不是在我的网址中替换页面参数,链接会向网址添加另一个页面参数。网址最终看起来像这样”/ all / a-z / page-1 / page-2 /“

那是因为

'<a href=page-{{next}}>Next Page> ({{next}})</a>'

相对于当前网址的页面链接,当前网址已经包含/ page-1 /。

我不确定如何将页面作为可选参数实际工作,并且Django替换了网页的旧页面部分

我建议的一件事是代替定义相对网址定义绝对网址

'<a href="/<other-part-of-url>/page-{{ next }}">Next Page> ({{ next }})</a>'