Comment utiliser les urls namespace avec django dans une application réutilisable
j'ai une application django, une application forum, qui a des modèles avec elle. Dans ces modèles, il y a des url qui renvoient à des parties de l'application. Par exemple, le modèle thread_list comporte des liens vers chaque thread comme suit:
{% for thread in threads %}
<a href="{% url forum_thread thread %}">{{thread.title}}</a>
{% endfor %}
Le truc, c'est que je n'aime pas vraiment appeler mon url "forum_thread". Je préfère juste "thread" et utiliser la fonctionnalité namespace de django. "forum_thread" peut être utilisé ailleurs dans le projet (collision entre espaces de noms).Donc ça ressemblera à ceci:
{% for thread in threads %}
<a href="{% url forum:thread thread %}">{{thread.title}}</a>
{% endfor %}
mais ce n'est pas la bonne façon de faire. Les docs sont un peu floues ici.
je veux que cette application soit réutilisable et facile à configurer. Mais je veux aussi utiliser les meilleures normes. Je ne veux pas que l'utilisateur spécifie son propre nom d'espace de noms, et qu'il édite chaque url dans chaque modèle.
Comment dois-je faire des urls dans cette application?
2 réponses
de ce que je peux comprendre vous devriez pouvoir utiliser {%url forum:thread thread%} comme vous l'avez décrit. Les Namespaces semblent toujours être définis avec deux variables, namespace et app_name.
si vous faites alors ce qui suit dans 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')),
selon mon interprétation, cela définit 3 instances de l'application 'forum', 'foo', 'bar', et la valeur par défaut (qui a namespace==app_name).
lorsque vous inversez forum: thread, il utilise le contexte courant pour déterminer un à utiliser - si vous êtes dans namespace 'foo', il l'utilisera, sinon il retombera sur la valeur par défaut.
si quelqu'un est en mesure de clarifier comment Django décide ce que L'espace de noms/app 'actuel' est qui serait très utile. Je la classe actuellement dans la catégorie "magie noire".
quelques clarifications sur la différence réelle entre namespace et app_name seraient également utiles - il est possible que j'ai ceci totalement inversé. Les documents actuels sont ambigüe.
Note: j'ai ceci qui fonctionne pour les requêtes initiales, mais je suis actuellement incapable de faire ce travail pour les requêtes AJAX - celles qui utilisent toujours l'instance par défaut pour une raison ou une autre.
ceci pourrait être une simple erreur de syntaxe. J'ai été à la suite de la Django Tutorial, et j'ai changé mysite/urls.py mal. L'original de la syntaxe:
url(r'^polls/', include('polls.urls')),
Le changement souhaité:
url(r'^polls/', include('polls.urls', namespace="polls")),
Ce que j'ai fait:
url(r'^polls/', include('polls.urls'), namespace="polls"),
corriger la syntaxe a résolu le problème.