web-dev-qa-db-fra.com

Django 2.0 'nom' n'est pas un espace de noms enregistré

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.

7
Tom

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!

8
Ershan

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').

0
Hiccup

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.

0
Neel

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'))
0
heemayl

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")),

Lire la documentation

0
ubadub

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>
0
Daniel Roseman