2012-06-22 35 views
14

Tôi hiện đang sử dụng phương thức redirect() của Django để xây dựng URL để chuyển hướng đến. Tôi không muốn hardcode URL vì vậy tôi đã làm nó như thế này:Chuyển hướng Django() với tham số anchor (#)

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

nào đưa tôi đến một cái gì đó như:

/home/test-123/

Nhưng tôi 'm thêm một số client-side theo dõi cho các URL cụ thể vì vậy tôi muốn sử dụng neo ở cuối dòng để xác định những thứ như người dùng truy cập lần đầu như thế này:

/home/test-123/# đầu tiên

ngắn của hardcoding URL trên trong phương thức redirect(), có một sự thay thế thanh lịch hơn để gắn thêm anchor vào cuối các URL được xây dựng của tôi không?

Cảm ơn, G

Trả lời

19

redirect()accepts URL, bạn có thể sử dụng reverse()to get one và phụ thêm một phần băm:

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}))) 

Ngoài ra, có một phím tắt django.shortcuts.resolve_url mà hoạt động như:

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

tôi sẽ gửi đó, nhưng bạn đã nhanh hơn;) Sự khác biệt duy nhất là tôi có lẽ sẽ đặt một số liên kết tài liệu, sử dụng định dạng chuỗi thay vì ghép và tách hai dòng này thêm để nhấn mạnh việc nhập phải xảy ra ở đầu tệp. Dù sao, +1 – Tadeck

+0

@Tadeck Thanks =) Tôi đã cập nhật câu trả lời. – okm

7

[Chỉ làm việc cho đến khi Django 1.8, không phải f unctional ở Django 1.9+, xem các bình luận!]

Bạn có thể thêm một neo vào cụm từ thông dụng trong urls.py. Đây là một ví dụ từ một ứng dụng diễn đàn mẫu sẽ chuyển đến bài viết mong muốn trong một chủ đề.

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'), 
+2

Đó là thực sự thanh lịch, tốt hơn rất nhiều so với hack được chấp nhận/upvoted, nhờ chia sẻ! –

+2

Có vẻ như trong Django 1.9 '#' gần đây sẽ được thoát như '% 23', vì vậy bạn sẽ không nhận được hiệu ứng mong đợi nếu bạn sử dụng chức năng' đảo ngược'. Sửa lỗi nhanh và bẩn là thêm '.replace ('% 23', '#')'. – Sapphire64

Các vấn đề liên quan