Как использовать URL-адреса пространства имен с django в повторном приложении
У меня есть приложение django, приложение для форума, в котором есть шаблоны. В этих шаблонах есть URL-адреса, которые указывают на части приложения. Например, шаблон 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-адреса в этом приложении?
Ответы
Ответ 1
Из того, что я могу собрать, вы должны использовать {% 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" и значение по умолчанию (которое имеет пространство имен == имя_программы).
Когда вы меняете форум: thread, он использует текущий контекст, чтобы определить, какой из них использовать, если вы находитесь в пространстве имен 'foo', он будет использовать это, в противном случае он будет отбрасываться по умолчанию.
Если кто-то может прояснить, как Django решает, что такое "текущее" пространство имен/приложение, это будет очень полезно. В настоящее время я классифицирую его как "черную магию".
Некоторое уточнение относительно фактической разницы между пространством имен и app_name также было бы полезно - возможно, что у меня это полностью отменено. Текущие документы очень неоднозначны.
Примечание. У меня есть эта работа для первоначальных запросов, но в настоящее время я не могу выполнить эту работу для запросов AJAX - они почему-то всегда используют экземпляр по умолчанию.
Ответ 2
Это может быть простая синтаксическая ошибка. Я следил за учебником Django, и я неправильно заменил 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"),
Исправление синтаксиса разрешило проблему.