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

Posted

技术标签:

【中文标题】Django 通用 object_list 分页。添加而不是替换参数【英文标题】:Django Generic object_list pagination. Adding instead of replacing arguments 【发布时间】:2011-04-22 22:22:05 【问题描述】:

我在 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/a-z/page-1/page-2/

发生这种情况并不奇怪,但实际上没有将 page 作为可选参数有效,并且 Django 替换了 url 的旧 page-part。

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

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

【问题讨论】:

【参考方案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 

【讨论】:

虽然所有给定的解决方案都可以工作(谢谢大家),但你的解决方案不仅解决了我的问题,而且还给了我一个更好的方式来使用 django。这似乎真的是松散的耦合,我的猴子- 一个项目真正需要的补丁。谢谢多米尼克!顺便提一句。我使用命名 url 而不是命名视图,为什么这在 django 开发人员中如此不受欢迎?编辑:编辑第一个太慢了:( @Tobias - 很高兴我能帮上忙 - 谢谢!我不确定为什么(或确实是否)命名 URL 在 Django 开发人员中不受欢迎——我一直使用命名 URL。也许可以就此提出一个单独的问题(并包括他们不受欢迎的证据!)。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

“链接不是替换我的网址中的页面参数,而是向网址添加另一个页面参数。网址最终看起来像这样“/all/a-z/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>'

【讨论】:

以上是关于Django 通用 object_list 分页。添加而不是替换参数的主要内容,如果未能解决你的问题,请参考以下文章

Django - 分页器

Django的分页和中间件

django 分页函数

Django分页

django分页器paginator使用简单说明

Django 利用 Pagination 简单分页