Al include() ing urlconf desde la aplicación Django al urls.py del proyecto, se debe especificar algún tipo de nombre de aplicación (o espacio de nombres) como:
app_namespace en include((pattern_list, app_namespace), namespace=None) en main urls.pyo
app_name variable en urls.py de la aplicación.Desde, supongo, Django 2, el segundo método es el preferido Aunque copié y pegué la firma de la primera función de la documentación de Django 3. Pero ese no es el punto principal.
Mi comprensión actual del parámetro de namespace de nombres de include() es que es lo que uso cuando uso reverse() .
¿Cuál es el propósito de app_name en urls.py de la aplicación o urls.py en app_namespace urls.py ?
¿Son exactamente lo mismo?
¿Cómo es usado por Django?
Las preguntas (y respuestas) existentes que he encontrado aquí explican CÓMO debo especificarlo en lugar de POR QUÉ.
De https://docs.djangoproject.com/en/3.0/topics/http/urls/#introduction :
Los espacios de nombres de URL le permiten invertir patrones de URL con nombre de manera única, incluso si diferentes aplicaciones usan los mismos nombres de URL. Es una buena práctica que las aplicaciones de terceros usen siempre direcciones URL con espacios de nombres (como hicimos en el tutorial). Del mismo modo, también le permite invertir las URL si se implementan varias instancias de una aplicación. En otras palabras, dado que varias instancias de una sola aplicación compartirán URL con nombre, los espacios de nombres proporcionan una forma de diferenciar estas URL con nombre.
app_name en app/urls.py y app_namespace en include((pattern_list, app_namespace), namespace=None) en main urls.py son los mismos referenciados que el espacio de nombres de la aplicación que describe el nombre de la aplicación que se está implementando.
Se puede pasar la app/urls.py completa o una cadena de referencia de app/urls.py con app_name para include()
# blog.urls from django.urls import path from . import views app_name = 'blog' urlpatterns = [ path('', views.index(), name='index'), path('<int:pk>/', views.post(), name='detail'), ] # project urls from django.urls import include, path urlpatterns = [ path('', include('blog.urls')), ]O
una tupla de patrones de URL y app_namespace para include()
# project urls from django.urls import include, path from blog.urls import urlpatterns as blogpatterns urlpatterns = [ path('', include((blogpatterns, 'blog'))), ] app_namespace será el espacio de nombres de la aplicación predeterminado cuando se proporcione en include() . Si no se proporciona app_namespace , buscará app_name en blog/urls.py y ese será el espacio de nombres predeterminado.
Sin el espacio de nombres de la aplicación, las direcciones URL se agregan al espacio de nombres global, lo que puede generar conflictos de direcciones URL.
Espacios de nombres de URL y URLconfs incluidos | Término espacio de nombres de la aplicación | incluir()
Durante años, hemos estado (en Django) eludiendo la (confusa) distinción entre un nombre de aplicación (espacio) y un espacio de nombres de instancia. Siempre recomendamos usar el espacio de nombres de la instancia, según los ejemplos en los documentos.
Lo que sucedió con Django 2.0 (y en adelante) es que lo hicieron para que no pueda usar un espacio de nombres de instancia sin usar también (primero) un nombre de aplicación. En lugar de corregir el código, debemos actualizar nuestros ejemplos para el uso correcto.
La inclusión debe ir así:
urlpatterns += [ url('API/', include((router.urls, 'pikachu')) ] La tendencia es incluir también el segundo parámetro de espacio de nombres de la instancia namespace='pikachu' , pero eso no es necesario; el valor predeterminado es Ninguno y se establece en 'pikachu' en este caso automáticamente.
En general, los usuarios desean incluir un módulo de URL de nivel de aplicación que establezca explícitamente el atributo app_name allí, en lugar de incluir el enrutador a mano.