J'ai vu cette erreur signalée à plusieurs reprises, mais je ne trouve personne utilisant Django 2.0 et ayant le problème.
Le problème est apparu lorsque j'ai essayé d'imbriquer une application dans une autre. L'application imbriquée (appelée "utilisateurs") est conçue pour permettre aux utilisateurs de se connecter et de se déconnecter. Après avoir mis ce segment dans, j'obtiens l'erreur suivante:
Template error:
In template C:\Users\arbit\Documents\python\learning_log\learning_logs\templates\learning_logs\base.html, error at line 6
'users' is not a registered namespace
1 : <p>
2 : <a href="{% url 'learning_logs:index' %}">Learning Log</a>
3 : <a href="{% url 'learning_logs:topics' %}">Topics</a>
4 : {% if user.is_authenticated %}
5 : Hello, {{ user.username }}.
6 : <a href=" {% url 'users:logout' %} ">log out</a>
7 : {% else %}
8 : <a href="{% url 'users:login' %}">log in</a>
9 : {% endif %}
10 : </p>
11 :
12 : {% block content %}{% endblock content %}
13 :
Voici ma racine urls.py
from Django.urls import path, include
from Django.contrib import admin
from . import views
app_name = "learning_log"
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('', include('learning_logs.urls')),
]
urlpatterns = [
# Home page
path('', views.index, name='index'),
# Show all topics
path('topics/', views.topics, name='topics'),
# Detail page for a single topic
path('topics/<int:topic_id>/', views.topic, name='topic'),
# Page for adding a new topic
path('new_topic/', views.new_topic, name='new_topic'),
# Page for adding a new entry
path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry'),
# Page for editing an entry
path('edit_entry/<int:entry_id>/', views.edit_entry, name='edit_entry'),
]
... et l'application "utilisateurs" url.py
from Django.urls import path
from Django.contrib.auth.views import login
from . import views
app_name = 'users'
urlpatterns = [
# Login page.
path('login/', login, {'template_name': 'users/login.html'}, name='login'),
# Logout page
path('logout/', views.logout_view, name='logout'),
]
et le fichier base.html de l'application "utilisateurs"
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
<a href="{% url 'learning_logs:topics' %}">Topics</a>
{% if user.is_authenticated %}
Hello, {{ user.username }}.
<a href="{% url 'users:logout' %}">log out</a>
{% else %}
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}
J'utilise certes un tutoriel plus ancien et je suis donc sûr que le problème est lié à quelque chose qui se trouve dans Django 2.0 mais pas dans la version plus ancienne couverte par le livre. Votre aide est grandement appréciée.
Il y a deux façons de résoudre ce problème.
Tout d'abord, vous pouvez définir un attribut app_name
dans le module inclus URLconf, au même niveau que l'attribut urlpatterns
. Vous devez transmettre le module actuel, ou une référence de chaîne au module, à include()
, pas à la liste de urlpatterns
elle-même.
https://docs.djangoproject.com/fr/2.0/topics/http/urls/#url-namespaces-and-included-urlconfs
urls.py
from Django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
]
sondages/urls.py
from Django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
...
]
s'amuser!
Essayez de changer votre app_name=''
(créer s'il n'y en a pas)
Dans la première application learning_logs
, vous avez oublié s
à la fin (par exemple, app_name = 'learning_logs'
).
J'avais le même problème, mais j'ai réussi à le résoudre en m'assurant que le projet urls.py a un chemin à afficher qui gère l'application, dans ce cas users
.
Définissez users
comme valeur de l'argument namespace
de la méthode include
pour définir l'espace de nom d'application approprié:
path('users/', include('users.urls', namespace='users'))
Vous devez réellement lui dire quel est l'espace de noms.
Changer cette ligne:
path('users/', include('users.urls')),
à:
path('users/', include('users.urls', namespace="users")),
Etant donné que les espaces-noms URL "learning_logs" incluent les "utilisateurs", ils sont considérés comme imbriqués. Ainsi, lorsque vous souhaitez trouver une URL dans "utilisateurs", vous devez utiliser les deux noms dans vos balises url
:
<a href="{% url 'learning_logs:users:logout' %}">log out</a>