it-swarm.com.ru

Django 2.0 'name' не является зарегистрированным пространством имен

Я видел эту ошибку несколько раз, но я не могу найти никого, кто использовал бы Django 2.0 и имел проблему. 

Проблема возникла, когда я попытался вложить одно приложение в другое. Вложенное приложение (называемое «пользователи») предназначено для того, чтобы пользователи могли входить и выходить из системы. После помещения этого сегмента я получаю следующую ошибку:

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 : 

Вот мой корень 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'),
]

... и приложение "пользователи" 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'),
]

и base.html из приложения "пользователи"

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

По общему признанию, я использую более старый учебник и, таким образом, уверен, что проблема связана с чем-то, что есть в Django 2.0, но не в более старой версии, которую охватывает книга. Ваша помощь очень ценится.

7
Tom

Есть два способа передать это.

Во-первых, вы можете установить атрибут app_name во включенном модуле URLconf на том же уровне, что и атрибут urlpatterns. Вы должны передать фактический модуль или строковую ссылку на модуль в функцию include(), а не в список самой urlpatterns.

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

urls.py

from Django.urls import include, path

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

опросы/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'),
    ...
]

повеселись!

8
Ershan

Попробуйте изменить свой app_name='' (создать, если его нет)

В первом приложении learning_logs вы забыли s в конце (например, app_name = 'learning_logs')

0
Hiccup

У меня была та же проблема, но мне удалось ее решить, убедившись, что у проекта urls.py есть путь для просмотра, который управляет приложением, в данном случае users.

0
Neel

Задайте users в качестве значения аргумента ключевого слова namespace метода include, чтобы задать соответствующее пространство имен приложения:

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

Вы действительно должны сказать ему, что такое пространство имен.

Измените эту строку:

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

чтобы:

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

Читать документацию

0
ubadub

Поскольку пространства имен URL-адреса «learning_logs» включают в себя пространство «пользователи», они считаются вложенными. Поэтому, если вы хотите найти URL внутри «users», вам нужно использовать оба имени в своих тегах url:

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