このエラーが何度か投稿されたことを確認しましたが、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'),
]
「users」アプリの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にあるものに関係していますが、本がカバーする古いバージョンには関係ありません。ご協力に感謝します。
これを処理する方法は2つあります。
まず、インクルードされたURLconfモジュールで、urlpatterns
属性と同じレベルで_app_name
_属性を設定できます。 urlpatterns
自体のリストではなく、実際のモジュールまたはモジュールへの文字列参照をinclude()
に渡す必要があります。
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')),
]
_
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'),
...
]
_
楽しんで!
app_name=''
in learning_logs/urls.py
。 (ない場合は作成します。)
最初に learning_logs
最後に忘れたアプリs
(例:app_name = 'learning_logs'
)
私は同じ問題を抱えていましたが、プロジェクトを管理するビューへのパスがプロジェクトurls.pyにあることを確認することで問題を解決することができました(この場合はusers
)。
users
をnamespace
メソッドのinclude
キーワード引数の値として設定して、適切なアプリケーション名前空間を設定します。
path('users/', include('users.urls', namespace='users'))
名前空間とは何かを実際に伝える必要があります。
この行を変更します。
path('users/', include('users.urls')),
に:
path('users/', include('users.urls', namespace="users")),
「learning_logs」URL名前空間には「ユーザー」の名前空間が含まれているため、ネストされていると見なされます。したがって、「users」内のURLを検索する場合は、url
タグで両方の名前を使用する必要があります。
<a href="{% url 'learning_logs:users:logout' %}">log out</a>