Django redirect() с параметрами anchor (#)

В настоящее время я использую метод перенаправления Django() для создания URL-адресов для перенаправления. Я не хочу жестко указывать URL-адрес, поэтому я делаю это следующим образом:

return redirect('main.views.home', home_slug=slug)

Который принимает меня к чему-то вроде:

/дома/тест-123/

Но я добавляю отслеживание на стороне клиента для определенных URL-адресов, поэтому я хотел использовать привязки в конце, чтобы идентифицировать такие вещи, как первые посещения пользователей, такие как:

/дома/тест-123/# первая

Заканчивая жесткую кодировку вышеуказанного URL-адреса в методе redirect(), существует ли более элегантная альтернатива добавлению якоря в конец моих сконструированных URL-адресов?

Спасибо, G

Ответы

Ответ 1

redirect() принимает URL, вы можете использовать reverse() для получить один и добавить хэш-часть:

from django.core.urlresolvers import reverse

return redirect(reverse('main.views.home', kwargs={'home_slug':slug}) + '#first')
# or string formatting
return redirect('{}#first'.format(reverse('main.views.home', kwargs={'home_slug':slug})))

Кроме того, есть ярлык django.shortcuts.resolve_url, который работает как:

'{}#first'.format(resolve_url('main.views.home', home_slug=slug))

Ответ 2

[Только работа до Django 1.8, не работающего в Django 1.9+, см. комментарии!]

Вы можете добавить привязку в регулярное выражение в urls.py. Вот пример из примера приложения для форума, которое переместится на нужную запись в потоке.

views.py

return redirect(post_list, 
    slug=post.thread.slug, 
    page=1, 
    anchor='post_{0}'.format(post.id)
)

urls.py

url(r'^thread/(?P<slug>[-\w]+)/(?P<page>[0-9]+)/#(?P<anchor>[-_\w]+)$', post_list, name='forum_view_thread'),
url(r'^thread/(?P<slug>[-\w]+)/(?P<page>[0-9]+)/$', post_list, name='forum_view_thread'),
url(r'^thread/(?P<slug>[-\w]+)/$', post_list, name='forum_view_thread'),