it-swarm.com.de

Django 2.0 'name' ist kein registrierter Namespace

Ich habe gesehen, dass dieser Fehler mehrmals veröffentlicht wurde, aber ich kann niemanden finden, der Django 2.0 verwendet und das Problem hat. 

Das Problem trat auf, als ich versuchte, eine App in eine andere zu schachteln. Die verschachtelte App ("Benutzer" genannt) soll Benutzern das Anmelden und Abmelden ermöglichen. Nachdem ich dieses Segment eingefügt habe, erhalte ich folgende Fehlermeldung:

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 : 

Hier ist meine Wurzel 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'),
]

... und die App "Benutzer" 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'),
]

und die base.html aus der "Benutzer" -App

<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 %}

Ich benutze zwar ein älteres Tutorial und bin daher sicher, dass das Problem etwas mit Django 2.0 zu tun hat, aber nicht mit der älteren Version, die das Buch behandelt. Ihre Hilfe wird gerne in Anspruch genommen.

7
Tom

Es gibt zwei Möglichkeiten, dies zu erreichen.

Erstens können Sie ein app_name-Attribut im enthaltenen URLconf-Modul auf derselben Ebene wie das urlpatterns-Attribut festlegen. Sie müssen das eigentliche Modul oder einen String-Verweis auf das Modul an include() übergeben, nicht an die Liste von urlpatterns selbst.

https://docs.djangoproject.com/de/2.0/topics/http/urls/#url-namespaces-and-inclus-urlconfs

urls.py

from Django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
]

polls/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'),
    ...
]

habe Spaß!

8
Ershan

Versuchen Sie, Ihren app_name='' zu ändern (erstellen, wenn keine vorhanden sind)

In der ersten learning_logs-App haben Sie am Ende s vergessen (z. B. app_name = 'learning_logs')

0
Hiccup

Ich hatte das gleiche Problem, konnte das Problem jedoch lösen, indem sichergestellt wurde, dass das Projekt urls.py über einen Pfad verfügt, der die App verwaltet. In diesem Fall users.

0
Neel

Legen Sie users als Wert des namespace-Schlüsselwortarguments der include-Methode fest, um den entsprechenden Anwendungsnamespace festzulegen:

path('users/', include('users.urls', namespace='users'))
0
heemayl

Sie müssen tatsächlich sagen, was der Namespace ist.

Ändern Sie diese Zeile:

path('users/', include('users.urls')),

zu:

path('users/', include('users.urls', namespace="users")),

Lesen Sie die Dokumentation

0
ubadub

Da die URL-Namespaces "learning_logs" die "Benutzer" enthalten, werden sie als verschachtelt betrachtet. Wenn Sie also eine URL in "users" finden möchten, müssen Sie beide Namen in Ihren url-Tags verwenden:

<a href="{% url 'learning_logs:users:logout' %}">log out</a>
0
Daniel Roseman