2010-07-01 11 views
22

Tengo una aplicación django, una aplicación de foro, que tiene plantillas con ella. En esas plantillas, hay URL que apuntan a partes de la aplicación. Por ejemplo, la plantilla thread_list tiene enlaces a cada hilo de esta manera:Cómo usar las URL de espacio de nombres con django en una aplicación reutilizable

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

La cuestión es que no me gusta llamar a mis URL "forum_thread". Prefiero solo "hilo" y usar la característica de espacio de nombres de django. "Forum_thread" puede ser utilizado en otra parte del proyecto (colisión espacio de nombres) .Así que se verá así:

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

pero esto no se siente como la forma correcta de hacerlo. Los documentos son poco claros aquí.

Quiero que esta aplicación sea reutilizable y fácil de configurar. Pero también quiero usar los mejores estándares. No quiero tener que hacer que el usuario especifique su propio nombre de espacio de nombres, y luego haga que editen cada URL en cada plantilla.

¿Cómo debo hacer las URL en esta aplicación?

+0

¡Tengo exactamente el mismo dilema! Bump! – frnhr

+0

¿Alguna vez se levantó con algo? Estoy experimentando el mismo problema y no estoy seguro de cómo se deben hacer las cosas. – Luke

Respuesta

14

Según lo que puedo reunir, debería poder usar {% url forum: thread thread%} como ha descrito. Los espacios de nombres siempre parecen estar definidos con dos variables, namespace y app_name.

Si a continuación, haga lo siguiente en 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')), 

A mi entender, esto define 3 instancias de la aplicación 'foro', 'foo', 'valor', y el valor por defecto (que tiene espacio de nombre == nombre_aplicación).

Cuando invierte forum: thread, usa el contexto actual para determinar cuál usar; si está en el espacio de nombres 'foo' lo usará; de lo contrario, recurrirá al valor predeterminado.

Si alguien puede aclarar cómo decide Django cuál es el espacio de nombres/aplicación "actual", sería muy útil. Actualmente lo categorizo ​​como 'magia negra'.

Algunas aclaraciones sobre la diferencia real entre el espacio de nombres y el nombre de la aplicación también serían útiles; es posible que lo haya revertido totalmente. Los documentos actuales son muy ambiguos.

Nota: Tengo esto funcionando para las solicitudes iniciales, pero actualmente no puedo hacer que esto funcione para las solicitudes AJAX; esas siempre usan la instancia predeterminada por algún motivo.

+2

Esto ahora está especificado en los documentos y parece que lo tienes correcto: https: //docs.djangoproject.com/en/dev/topics/http/urls/# reversing-namespaced-urls Creo que no es necesario especificar 'app_name = 'forum'' a menos que desee usar algo diferente del nombre del módulo. Supongo que si no está trabajando para solicitudes AJAX, es posible porque está procesando la respuesta de manera diferente (tal vez sin usar una plantilla o sin usar RequestContext) y por lo tanto, la aplicación actual debe especificarse manualmente al revertir las direcciones URL. – Anentropic

+1

El problema es que estas URL solo se pueden incluir en las URL raíz. Es decir. hay una aplicación _app_ con _site_ incluida en las URL raíz _app/urls.py_: 'url (r '^/site /', include ('site.urls', namespace = 'site', app_name = 'site')) ', _site_ aplicación incluye foro: ' url (r '^/forum /', include ('forum.urls', namespace = 'forum', app_name = 'forum')) ' Rompe foro como sus URL no se puede revertir como 'foro: *' sino 'sitio: foro' * ' –

1

Esto podría ser un simple error de sintaxis. Estaba siguiendo el Django Tutorial, y cambié mysite/urls.py incorrectamente. La sintaxis originales:

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

el cambio deseado:

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

Lo que hice:

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

Corregir la sintaxis resuelva el problema.

Cuestiones relacionadas