我在使用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或模板标签解决这一问题将非常感激。
(也请原谅非母语英语和动态翻译代码。如果这是一个好的或无根据的堆栈溢出问题的任何反馈也很乐意)
答案 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>'