2010-07-01 16 views
22

Tôi có một ứng dụng django, một ứng dụng diễn đàn, có các mẫu với nó. Trong các mẫu đó, có các url trỏ đến các phần của ứng dụng. Ví dụ mẫu thread_list có liên kết đến từng chủ đề như vậy:Làm thế nào để sử dụng url không gian tên với django trong một ứng dụng reusuable

{% for thread in threads %} 
    <a href="{% url forum_thread thread %}">{{thread.title}}</a> 
{% endfor %} 

Có điều là, tôi không thực sự thích gọi url của tôi "forum_thread". Tôi chỉ thích "chủ đề" và sử dụng tính năng không gian tên của django. "Forum_thread" chưa được sử dụng ở một nơi khác trong dự án (namespace va chạm) Vì vậy, nó sẽ giống như thế này:

{% for thread in threads %} 
    <a href="{% url forum:thread thread %}">{{thread.title}}</a> 
{% endfor %} 

nhưng điều này không có cảm giác như cách chính xác để làm điều này. Các tài liệu không rõ ràng ở đây.

Tôi muốn ứng dụng này có thể sử dụng lại và dễ định cấu hình. Nhưng tôi cũng muốn sử dụng các tiêu chuẩn tốt nhất. Tôi không muốn làm cho người dùng chỉ định tên không gian tên của riêng họ, và sau đó yêu cầu họ chỉnh sửa từng url duy nhất trong mỗi mẫu.

Tôi nên làm các url trong ứng dụng này như thế nào?

+0

Tôi có cùng một mức độ phù hợp! Bump! – frnhr

+0

Bạn đã từng làm bất cứ điều gì chưa? Tôi đang gặp vấn đề tương tự và không chắc chắn mọi thứ nên được thực hiện như thế nào. – Luke

Trả lời

14

Từ những gì tôi có thể thu thập, bạn có thể sử dụng {% url forum: thread thread%} như bạn đã mô tả. Không gian tên dường như luôn được định nghĩa với hai biến, không gian tên và app_name.

Nếu sau đó bạn làm như sau trong urls.py:

url(r'^/forum/', include('forum.urls', namespace='forum', app_name='forum')), 
url(r'^/foo/', include('forum.urls', namespace='foo', app_name='forum')), 
url(r'^/bar/', include('forum.urls', namespace='bar', app_name='forum')), 

Trong hiểu biết của tôi, điều này xác định 3 trường hợp của ứng dụng 'diễn đàn', 'foo', 'bar', và mặc định (mà có namespace == app_name).

Khi bạn đảo ngược diễn đàn: chuỗi, nó sử dụng ngữ cảnh hiện tại để xác định cái nào sẽ sử dụng - nếu bạn đang ở trong không gian tên 'foo', nó sẽ sử dụng nó, nếu không nó sẽ rơi trở lại mặc định.

Nếu có ai có thể làm rõ cách Django quyết định không gian tên/ứng dụng 'hiện tại' sẽ rất hữu ích. Tôi hiện đang phân loại nó thành 'ma thuật đen'.

Một số làm rõ về sự khác biệt thực sự giữa không gian tên và app_name cũng sẽ hữu ích - có thể là tôi đã hoàn toàn đảo ngược. Các tài liệu hiện tại rất mơ hồ.

Lưu ý: Tôi làm việc này cho các yêu cầu ban đầu, nhưng hiện tại tôi không thể thực hiện công việc này cho các yêu cầu AJAX - những người luôn sử dụng cá thể mặc định vì một số lý do.

+2

Điều này hiện được chỉ định trong tài liệu và có vẻ như bạn đã sửa nó: https: //docs.djangoproject.com/en/dev/topics/http/url/# đảo ngược-namespaced-url Tôi nghĩ rằng nó không cần thiết để xác định 'app_name = 'forum'' trừ khi bạn muốn sử dụng một cái gì đó khác với tên module. Tôi đoán nếu không làm việc cho các yêu cầu AJAX thì có thể vì bạn đang trả lời một cách khác nhau (có lẽ không sử dụng mẫu hoặc không sử dụng RequestContext) và vì vậy ứng dụng hiện tại cần phải được chỉ định thủ công khi đảo ngược các url. – Anentropic

+1

Vấn đề là url này chỉ có thể được bao gồm trong các url gốc. I E. có _app_ với ứng dụng _site_ được bao gồm trong url gốc _app/urls.py_: 'url (r '^/site /', bao gồm ('site.urls', namespace = 'site', app_name = 'site') ', _site_ ứng dụng bao gồm diễn đàn: ' url (r '^/forum /', bao gồm ('forum.urls', namespace = 'diễn đàn', app_name = 'diễn đàn')) ' Nó phá vỡ diễn đàn như url của nó không thể đảo ngược thành 'forum: *' nhưng 'site: forum' * ' –

1

Đây có thể là lỗi cú pháp đơn giản. Tôi đang theo dõi Django Tutorial và tôi đã thay đổi mysite/urls.py không đúng cách. Cú pháp gốc:

url(r'^polls/', include('polls.urls')), 

Sự thay đổi mong muốn:

url(r'^polls/', include('polls.urls', namespace="polls")), 

Những gì tôi đã làm:

url(r'^polls/', include('polls.urls'), namespace="polls"), 

Sửa chữa cú pháp giải quyết vấn đề này.

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