Подтвердить что ты не робот

Как использовать 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-адреса в этом приложении?

4b9b3361

Ответ 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"),

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