python - from - include namespace django
ImpropyConfiguredError sobre app_name al usar el espacio de nombres en include() (6)
Actualmente estoy probando django.
Uso el argumento del
namespace
en uno de mis
include()
s en urls.py.
Cuando ejecuto el servidor e intento navegar, aparece este error.
File "C:/Users/User/AppData/Local/Programs/Python/Python36-32/lib/site-packages/django/urls/conf.py", line 39, in include
''Specifying a namespace in include() without providing an app_name ''
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
Estos son mis archivos urls.py:
#project/urls.py
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r''^reviews/'', include(''reviews.urls'', namespace=''reviews'')),
url(r''^admin/'', include(admin.site.urls)),
]
y
#app/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# ex: /
url(r''^$'', views.review_list, name=''review_list''),
# ex: /review/5/
url(r''^review/(?P<review_id>[0-9]+)/$'', views.review_detail, name=''review_detail''),
# ex: /wine/
url(r''^wine$'', views.wine_list, name=''wine_list''),
# ex: /wine/5/
url(r''^wine/(?P<wine_id>[0-9]+)/$'', views.wine_detail, name=''wine_detail''),
]
¿Qué paso el
app_name
como se indica en el mensaje de error?
Django 1.11+, 2.0+
Debe establecer el nombre_aplicación en el archivo de URL que está incluyendo
# reviews/urls.py <-- i.e. in your app''s urls.py
app_name = ''reviews''
Luego puede incluirlo de la manera en que lo está haciendo.
Además, puede valer la pena señalar lo que dicen los documentos de Django aquí https://docs.djangoproject.com/en/1.11/ref/urls/#include :
En desuso desde la versión 1.9: el soporte para el argumento nombre_aplicación está en desuso y se eliminará en Django 2.0. Especifique el nombre_aplicación como se explica en los espacios de nombres de URL y en su lugar incluye URLconfs.
( https://docs.djangoproject.com/en/1.11/topics/http/urls/#namespaces-and-include )
Consulta los documentos para incluirlos here .
Lo que ha hecho no es una forma aceptable de pasar parámetros para incluir. Podrías hacerlo:
url(r''^reviews/'', include((''reviews.urls'', ''reviews''), namespace=''reviews'')),
Django 2.0 debe especificar app_name en su urls.py , no es necesario especificar el argumento app_name en include.
Archivo de URL principal.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('''', include(''apps.main.urls'')),
path(''admin/'', admin.site.urls),
]
URL incluida
from django.urls import path
from . import views
app_name = ''main_app''
urlpatterns = [
path('''', views.index, name=''index''),
]
Luego use el uso en la plantilla como
<a href="{% url main_app:index'' %}"> link </a>
Más detalles: https://code.djangoproject.com/ticket/28691 Django 2.0 Docs
En mi caso, estaba escribiendo las URL fuera de la lista de patrones de url. Revisa otra vez, por favor.
Incluí una biblioteca que aún no es (totalmente) compatible con django 2.1 (django_auth_pro_saml2).
Por lo tanto, creo un segundo archivo
saml_urls.py
:
from django_saml2_pro_auth.urls import urlpatterns
app_name = ''saml''
Tal que podría incluir las URL como:
from django.urls import include, re_path as url
urlpatterns = [
..., url(r'''', include(''your_app.saml_urls'', namespace=''saml'')), ...
]
Hacky, pero funcionó para mí, mientras que la
url(r''^reviews/'', include((''reviews.urls'', ''reviews''), namespace=''reviews''))
no lo hizo.
También me enfrento al mismo error en Django 2.2 y lo resuelvo de esta manera
archivo urls.py
urlpatterns = [
path(''publisher-polls/'', include(''polls.urls'', namespace=''publisher-polls'')),
]
archivo de encuestas / urls.py
app_name = ''polls''
urlpatterns = [
path('''', views.IndexView.as_view(), name=''index'')
]
ejemplo de uso del espacio de nombres en el método de vista basado en calss
def get_absolute_url(self):
from django.urls import reverse
return reverse(''polls.index'', args=[str(self.id)])
ejemplo de uso del espacio de nombres en plantillas
{% url ''polls:index'' %}
Aquí encuestas: index mean app_name [definir en el archivo polls / urls.py ]: nombre [definir en el archivo polls / urls.py dentro de la función de ruta]
su oficial, que es bastante bueno, puedes consultar para obtener más información namespace_django_official_doc