1

我在 django 通用 object_list 函数的分页上遇到了一些麻烦,它并没有真正“聪明”到足以弥补我的愚蠢。

我正在尝试使用页码和类别的可选参数列出一个 url。urls.py 中的 url 如下所示:

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

category 和 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%}

链接没有替换我的 url 中的 page 参数,而是向 url 添加了另一个 page 参数。网址最终看起来像这样“/all/az/page-1/ page-2/

发生这种情况并不奇怪,但是没有将 page 作为可选参数实际上可以工作,并且 Django 替换了 url 的旧页面部分。

我更喜欢这个 DRYer(至少我这么认为)解决方案,但似乎无法让它工作。任何提示如何使用更好的 urls.py 或模板标签来解决这个问题将不胜感激。

(也请原谅非母语英语和即时翻译的代码。任何关于这是一个好的或无根据的堆栈溢出问题的反馈也很乐意接受)

4

3 回答 3

1

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

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

一切都会好起来的,除了你的模板中有一个脆弱的链接,一旦你改变你的链接就会中断,urls.py除非category碰巧是a-z.

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

<a href="{% url views.listing category next %}">Next Page> ({{ next }})</a>

为了使这项工作,您必须将您的类别传递到extra_context_dict您在视图代码的第一行创建的类别中:

extra_context_dict = { 'category': category }
于 2010-10-08T15:35:19.963 回答
0

/all/a-z/page-1/page-2/出现在源代码中还是链接将您带到哪里?我的猜测是浏览器将字符串“page-2”附加到当前URL。您应该以 URL 开头,/以便声明完整路径。

您可能应该将类别添加到extra_context并执行以下操作:

 <a href="/all/{{category}}/page-{{next}}">next page ({{next}})</a>
于 2010-10-08T15:37:00.227 回答
0

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

那是因为

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

指向相对于当前 url 的页面的链接,并且当前 url 中已经包含 /page-1/ 。

我不确定如何,没有 page 作为可选参数实际上有效,Django 替换了 url 的旧页面部分

我建议的一件事是定义绝对 url 而不是定义相对 url

'<a href="/<other-part-of-url>/page-{{ next }}">Next Page> ({{ next }})</a>'
于 2010-10-08T15:37:06.090 回答