[英]Django - is not a registered namespace
我正在嘗試使用以下代碼在 django/python 中處理表單。
主頁.html:
<form action="{% url 'home:submit' %}" method='post'>
視圖.py:
def submit(request):
a = request.POST(['initial'])
return render(request, 'home/home.html', {
'error_message': "returned"
})
網址.py:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^submit/$', views.submit, name='submit')
]
當我嘗試在瀏覽器中運行它時,出現錯誤:
NoReverseMatch at /home/ u'home' is not a registered namespace
以及另一條指示表單存在問題的錯誤消息。
您應該在模板中更改您的操作網址:
<form action="{% url 'submit' %} "method='post'>
關於 url 命名空間的注釋...
為了能夠使用home
命名空間調用 url,您應該在主 urls.py 文件行中包含以下內容:
對於 django 1.x:
url(r'^', include('home.urls', namespace='home')),
對於 django 2.x 和 3.x
path('', include(('home.urls', 'home'), namespace='home'))
在您的主項目中,首先打開 url.py。 然后檢查,應該首先聲明了 app_name 。 如果不是,請聲明它。
例如,我的應用名稱是在 url.py 中聲明的用戶信息
app_name = "userinfo"
urlpatterns = [
url(r'home/', views.home, name='home'),
url(r'register/', views.registration, name='register')
]
我也面臨同樣的問題。 現在通過添加來修復它
app_name = "<name of your app>"
在應用程序/urls.py
對於 Django 3.0,如果您在應用程序中處理 url 並在project/urls.py
中使用include
和path
:
urlpatterns = [
path(os.getenv('ADMIN_PATH'), admin.site.urls),
path('', include('my_simple_blog.urls', namespace='my_simple_blog')),
path('account/', include('account.urls', namespace='account')),
]
您需要在include
中指定namespace
。
然后在您的app/urls.py
中:
app_name = 'account'
urlpatterns = [
path('register/', registration_view, name='register'),
path('logout/', logout_view, name='logout'),
path('login/', login_view, name='login'),
]
app_name
必須與您在project/urls.py
中指定的namespace
相匹配。
每當您引用這些網址時,您都需要這樣做:
{% url 'namespace:name' %}
如果您將它與redirect
一起使用:
return redirect('namespace:name')
對於命名空間錯誤,請確保您已將應用程序的 url 鏈接到主 urls.py 文件中
path('app_name/',include('app_name.urls'))
同樣在您的應用程序的 urls.py 中,請確保您提及應用程序的名稱
app_name='app_name'
還要確保您已在 settings.py 中已安裝的應用程序上注冊了應用程序的名稱
正如 azmirfakkri 所說,如果您使用redirect
,請不要使用此{% url 'namespace:name' %}
語法,請使用return redirect('namespace:name')
。
可能有兩件事可能是根本原因,在 app/urls.py 中確實包括以下內容
app_name = 'required_name'
並且在項目 urls.py 中還包括 app_name
url(r'^required_name/$',views.home,name='required_name'),
檢查:在 settings.py INSTALLED_APPS 中注冊應用程序
標簽名稱在項目內應用程序包內的urls.py
文件中必須是唯一的! 模板標記路由什么和在哪里很重要。
現在 [1] 在urls.py
文件中,您需要聲明變量appName
並為其賦予唯一值。 例如appName = "myApp";
在您的情況下, myHomeApp和 [2] 還定義了 urlpatterns 列表...
urlpatterns = [..., url(r'^submit/$', views.submit, name='submit'), ...];
在 html 文件中,只需將 url 標簽更改為:
<form action="{% url 'myHomeApp:submit' %}" method='post'>
這應該可以...否則就寫在這里,我們會看到如何繼續
我經常發現的一個常見錯誤是當您的模板中有一些名稱空間時,而在 YourApp.url 中您沒有任何名稱空間,因此如果您應該使用名稱空間,請在 YourApp.url 中添加類似這樣的 app_name = "blog "
然后在你的太陽穴上確保你添加了你的名字空間,所以你會有這樣的東西“假設錯誤來自edit.html
”然后在那個特定的模板上你會這樣做
"{% url 'blog:vote' pk=post.pk %}"
"{% url 'blog:post_category' category.name %}"
如果你碰巧嵌套了include(
s,命名空間復合,例如topappname:appname:viewname
url(r'^jet/', include('jet.urls', 'jet')), # Django JET URLS
url(r'^jet/dashboard/', include('jet.dashboard.urls', 'jet-dashboard')), # Django JET dashboard URLS
也許有人會發現這個建議很有幫助。
轉到您的應用程序urls.py
並在 urlpatterns 之前鍵入:
app_name = 'Your app name'
對於像我這樣為這個錯誤而苦苦掙扎的人:在閱讀了這個問題的解決方案之后,我在錯誤的 urls 文件中的include
函數中設置了namespace
。 確保您正在修改正確的 urls 文件。 對我來說,除了settings.py
之外,它還放在主url.py
中。 我希望這個答案可以幫助任何像我一樣感到困惑的人。
我在下面得到了同樣的錯誤:
/account/register/ 'account' 處的 NoReverseMatch 不是已注冊的命名空間
所以,我將應用程序名稱“account”的“app_name”設置為“account/urls.py” ,如下所示,然后上面的錯誤就解決了:
# "account/urls.py"
from django.urls import path
from . import views
app_name = "account" # Here
urlpatterns = [
path("register/", views.register_request, name="register")
]
檢查你的 urls.py
urlpatterns = [
re_path(r'^submit/expense/$', views.submit_expense, name='submit_expense'),
re_path(r'^submit/income/$', views.submit_income, name='submit_income'),
re_path(r'^register/$', views.register, name='register'),
]
然后打開 template.html 將例如寄存器寄存器放在您的 HTML 標簽中,如下所示:
<a class="navbar-brand" href="{% url 'register' %}">
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.