Django Общая нумерация объектов.Добавление вместо замены аргументов - PullRequest
1 голос
/ 08 октября 2010

У меня возникли проблемы с разбиением на страницы общей функции object_list django, которая недостаточно умна, чтобы компенсировать мою глупость.

Я пытаюсь создать URL для перечисления с необязательными аргументами для номера страницы и категории. URL в urls.py выглядит так:

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

Аргументы категории и 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, ссылка добавляет другой URL-адрес страницы в URL. URL в конечном итоге выглядит следующим образом "/ all / a-z / page-1 / page-2 /

Не удивительно, что именно так и происходит, но отсутствие страницы в качестве необязательного аргумента действительно работает, и Django заменяет старую часть страницы в URL.

Я бы предпочел это DRYer (по крайней мере, я так думаю) решение, но, похоже, оно не работает. Любые советы, как это можно решить с помощью лучших urls.py или шаблонных тегов, будут очень благодарны.

(также, пожалуйста, извините за неродной английский и на лету переведенный код. Любая обратная связь относительно того, является ли это хорошим или необоснованным вопросом переполнения стека, также с радостью принимается)

Ответы [ 3 ]

1 голос
/ 08 октября 2010

Вы используете относительные 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 }
0 голосов
/ 08 октября 2010

"Вместо замены аргумента страницы в моем URL-адресе ссылка добавляет другой URL-адрес страницы в URL-адрес. URL-адреса в конечном итоге выглядят так:" / all / a-z / page-1 / page-2 / "

это потому что

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

ссылки на страницу, относящиеся к текущему URL, а текущий URL уже содержит / page-1 /.

Я не уверен, как, не имея страницы в качестве необязательного аргумента, на самом деле работает, и Django заменяет старую часть страницы в URL

Единственное, что я предлагаю - вместо определения относительного URL определить абсолютный URL

'<a href="/<other-part-of-url>/page-{{ next }}">Next Page> ({{ next }})</a>'
0 голосов
/ 08 октября 2010

Является ли /all/a-z/page-1/page-2/ тем, что появляется в источнике или куда ведет ссылка?Я предполагаю, что строка "page-2" добавляется браузером к текущему URL.Вы должны начать с URL с /, чтобы указать полный путь.

Вам, вероятно, следует добавить категорию в extra_context и сделать:

 <a href="/all/{{category}}/page-{{next}}">next page ({{next}})</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...