Как использовать URL-адреса пространства имен с django в повторно используемом приложении - PullRequest
22 голосов
/ 01 июля 2010

У меня есть приложение django, приложение для форума, в котором есть шаблоны.В этих шаблонах есть ссылки, которые указывают на части приложения.Например, шаблон thread_list имеет ссылки на каждую тему, например, так:

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

Дело в том, что я не очень люблю называть свои URL-адреса "forum_thread".Я предпочитаю просто «нить» и использую функцию пространства имен django.«forum_thread» может использоваться где-то еще в проекте (столкновение пространства имен). Так что это будет выглядеть так:

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

, но это не похоже на правильный способ сделать это.Документы здесь не совсем понятны.

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

Как мне делать URL в этом приложении?

Ответы [ 3 ]

14 голосов
/ 07 ноября 2011

Из того, что я могу собрать, вы сможете использовать {% url forum: thread thread%}, как вы описали. Кажется, что пространства имен всегда определяются двумя переменными, пространством имен и именем приложения.

Если вы затем выполните следующее в 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')),

В моем понимании, это определяет 3 экземпляра приложения 'форум', 'foo', 'bar' и значение по умолчанию (которое имеет пространство имен == имя_приложения).

Когда вы переворачиваете форум: поток, он использует текущий контекст, чтобы определить, какой из них использовать - если вы находитесь в пространстве имен 'foo', он будет использовать его, в противном случае он вернется к стандартному.

Если кто-то сможет объяснить, как Django решает, что такое «текущее» пространство имен / приложение, это было бы очень полезно. В настоящее время я классифицирую его как «черную магию».

Некоторое разъяснение о фактической разнице между пространством имен и именем_приложения также было бы полезно - возможно, я полностью изменил это. Нынешние документы весьма неоднозначны.

Примечание: у меня это работает для начальных запросов, но в настоящее время я не могу сделать это для AJAX-запросов - по какой-то причине они всегда используют экземпляр по умолчанию.

1 голос
/ 08 апреля 2015

Это может быть простая синтаксическая ошибка.Я следовал Django Tutorial и неправильно изменил mysite / urls.py.Исходный синтаксис:

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

Требуемое изменение:

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

Что я сделал:

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

Исправление синтаксиса решило проблему.

0 голосов
/ 20 марта 2019

исходя из моего понимания этого вопроса:

в Джанго 2.1.7

  • Вы можете указать имя приложения в файле urls.py приложения
# app's urls.py
from django.urls import path
from . import views

app_name = 'forum'
urlpatterns = [
    path('thread/', views.mark_done, name='thread')
]

в основном urls.py

# urls.py
....

urlpatterns = [
    path('forum/', include('forum.urls')),
]

тогда вы можете использовать {% url 'forum:thread' %} в своем шаблоне

  • Если вы хотите использовать его в цикле for

Я думаю, что мы должны

  1. создать представление вернуть все threads в качестве контекста
  2. затем добавьте путь к этому представлению
...
path('thread/<int:pk>', views.mark_done, name='thread')

URL в шаблоне понравится:

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