2010-08-26 27 views
24

Hãy xem xét rằng tôi bao gồm namespaced ứng dụng tái sử dụng:Làm thế nào để làm tìm kiếm URL ngược trong ứng dụng tái sử dụng Django namespaced

urlpatterns = patterns('', 
    # ella urls 
    url('^ella/', include('ella.core.urls', namespace="ella")), 
) 

Bây giờ, các ứng dụng Ella có url như thế:

urlpatterns = patterns('', 
    url(r'^(?P<category>[a-z0-9-/]+)/$', category_detail, name="category_detail"), 
    # object detail 
    url(r'^(?P<category>[a-z0-9-/]+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<content_type>[a-z0-9-]+)/(?P<slug>[a-z0-9-]+)/$', 
     object_detail, name="object_detail") 
) 

Bây giờ, gọi {% url ella:category_detail category="cat" %} hoạt động tốt. Tuy nhiên, khi đối tượng cố gắng để tạo ra liên kết đến các chi tiết của nó, nó gọi

from django.core.urlresolvers import reverse 
url = reverse('object_detail', kwargs={'required' : 'params'}) 

Đây không phải đang làm việc, trừ khi viết lại như

from django.core.urlresolvers import reverse 
url = reverse('ella:object_detail', kwargs={'required' : 'params'}) 

Vì vậy, nếu tôi hiểu nó một cách chính xác, bao gồm cả ứng dụng tái sử dụng vào không gian tên phá vỡ tất cả các đảo ngược bên trong() s bên trong ứng dụng đã cho.

Có đúng không? Tôi đã bỏ lỡ điều gì? Có cách nào xung quanh không?

+0

+1 Tôi sắp hỏi cùng một câu hỏi –

Trả lời

6

Vì bạn có cấu hình url theo tên, bạn cần phải đề cập đến không gian tên: mẫu tên khung nhìn để đảo ngược đúng cách (đặc biệt là từ chế độ xem).

Nhưng, nếu bạn muốn tránh điều này, bạn cũng có thể chuyển không gian tên/tên ứng dụng dưới dạng tham số current_app. Có nhiều cách để chỉ định current_app khi bạn đang ở trong mẫu. Nhưng nếu bạn đang ở trong tầm nhìn, bạn cần phải mã hóa cứng như bạn đã làm, hoặc chuyển cho tham số CURRENT_APP

url = reverse('object_detail', 
       kwargs={'foo':'bar'}, 
       current_app=app_name_or_name_space) 

tham khảo: http://docs.djangoproject.com/en/dev/topics/http/urls/#reverse

+6

Tôi nghĩ câu hỏi thực sự là: có cách nào để bao gồm ứng dụng có thể tái sử dụng của bên thứ ba với không gian tên URL và không cần viết lại tất cả các cuộc gọi đến hàm reverse() bên trong ứng dụng có thể sử dụng lại. – moberley

+0

Đúng vậy. current_app là cùng một hardcode như tiền tố: ... nhưng cảm ơn cho các trick. – Almad

+1

Đồng ý. Nhưng, Làm thế nào để có được tên ứng dụng hiện tại? là có, nếu không, làm thế nào thực sự các ứng dụng có thể cắm được. –

0

Namespaces URL có thể được xác định theo hai cách.

Thứ nhất, bạn có thể cung cấp không gian tên ứng dụng và cá thể làm đối số để bao gồm() khi bạn tạo các mẫu URL của mình. Ví dụ ,:

(r '^ help /', bao gồm ('apps.help.urls', namespace = 'foo', app_name = 'bar')),

Đây là ngay từ http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces.

Hãy thử thay đổi include('ella.core.urls', namespace="ella") thành include('ella.core.urls', namespace="ella", app_name="ella"). Tôi không 100% điều này sẽ làm việc, nhưng nó có giá trị một shot.

0

Ít nhất trong Django 1.8 bạn có thể viết một cái gì đó như thế này:

url = reverse('%s:object_detail' % request.resolver_match.namespace, kwargs={'required' : 'params'})

request.resolver_match.namespace là một chuỗi chứa tên miền không gian của cái nhìn hiện đang chạy.

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