Django-未注册的命名空间

77

我正在尝试使用以下代码在django/python中处理表单。


home.html:

<form action="{% url 'home:submit' %}" method='post'>

views.py:

def submit(request):
    a = request.POST(['initial'])
    return render(request, 'home/home.html', {
        'error_message': "returned"
    })

urls.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
还有另一个指示表单问题的错误消息。

你是否将“home”注册为命名空间? - Sayse
可能是什么是NoReverseMatch错误,如何修复它?的重复问题。 - Sayse
将其注册为命名空间,只需在INSTALLED_APPS中添加“home.apps.HomeConfig”即可,这不是很简单吗? - Programmerr
与已安装的应用程序无关。 - Sayse
1
这在官方Django教程中有所涵盖,并且在文档中有更详细的介绍。 - djvg
16个回答

98

您只需要在您的模板中更改操作URL:

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

5
Django 3(可能也适用于Django 2):path('someurl', include(('home.urls', 'home'), namespace='home')) 翻译:将 'home.urls' 中的URL映射到路径为'someurl'的视图中,并使用名称空间'home'。 - mirek
我认为你没有更新答案。问题不在于url/path,而是include()的第一个参数必须是元组。否则,您将收到错误消息:"在include()中指定命名空间但未提供app_name不受支持。请在包含的模块中设置app_name属性或传递一个包含模式列表和app_name的2个值的元组。" - mirek
在 Django 4.1 中,路径为 path('publisher-polls/', include('polls.urls', namespace='publisher-polls'))。 - MD Sulaiman
1
您还应在app.urls文件中定义一个app_name变量,并将其设置为您的应用程序的名称(作为字符串)。如下所示,app_name='myapp'。如果未这样做,您将遇到此错误“django.core.exceptions.ImproperlyConfigured:在include()中指定命名空间而不提供app_name不受支持”。 (Django 4.1) - ismail pervez
在Django 4中,你可以通过导入urls.py文档来构建命名空间。 例如,在我的主要url.py中,我用命名空间X导入app-x.url.py。 在app-x.urls.py中,我用命名空间Y导入app-x.specific_urls.py。 假设在specific_urls.py中有名为"New"的url。作为操作URL,我可以使用:href="{% url "X:Y:New" %}"也许你想把这加到你的帖子里。 祝好 Django 4.2 - undefined

33

在您的主项目中,首先打开url.py。然后检查,应该在最前面声明app_name。如果没有声明,请进行声明。

例如,我的应用程序名称是用户信息,已在url.py中声明。

app_name = "userinfo"

urlpatterns = [
    url(r'home/', views.home, name='home'),
    url(r'register/', views.registration, name='register')
]

我想确认这在django 3.0中是否可行。然后可以使用{% url 'userinfo:...' %}。也许只有这种方式是可能的。以下对我无效:1)项目级别urls.py中的name=或namespace=,2)apps.py中的设置(也许我不知道正确的设置)。 - mirek
1
我需要更正之前的评论:主urls.py中的此语法也有效:path('someurl',include(('home.urls','home'),namespace ='home')) - mirek
这是过时的语法。 - Soren

25

我也遇到了同样的问题。 现在通过添加解决了问题。

app_name = "<name of your app>" 

在 app/urls.py 中


9

Django 3.0中,如果您在应用内处理url并使用pathinclude,则需在project/urls.py中:

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时,需要以以下方式进行:
{% url 'namespace:name' %}

如果您使用它与redirect一起使用:
return redirect('namespace:name')

9
针对 命名空间错误,请确保在主 urls.py 文件中链接了应用程序的 url。
path('app_name/',include('app_name.urls'))

同样在你的应用的 urls.py 文件中,确保你提到了应用程序的名称:

app_name='app_name'

同时确保你已经在settings.py中的已安装应用程序中注册了应用程序的名称。


我按照您的步骤操作,发现问题出在我的代码上。这是我所做的更改,分享给那些需要实际例子的人:https://github.com/kasir-barati/go-back-to-score-one-in-learning-django/commit/87a38ea7705d62d147f7485549eb029f45f925c6 - Kasir Barati

3
正如 azmirfakkri 所说,如果你使用 redirect,不要使用这种 {%url'namespace:name'%} 语法,而应该使用 return redirect('namespace:name')。

<a href="return redirect('product_detail' product.slug)" class="card-footer-item">View</a> - AnonymousUser

3
可能有两个根本原因, 在 app/urls.py 中,请按以下方式包含。
app_name = 'required_name'

在项目的urls.py中,还要包含app_name。

url(r'^required_name/$',views.home,name='required_name'),

检查:在settings.py的INSTALLED_APPS中注册应用程序


2
一个常见的错误是当你在模板中使用一些命名空间,而在 YourApp.url 中没有任何命名空间,所以如果你应该使用命名空间,请在 YourApp.url 中添加类似于这样的内容: app_name = "blog"
然后在你的模板中确保你添加了你的命名空间,这样你就会得到这样的东西:"假设错误来自于 edit.html",然后在那个特定的模板中,你需要这样做: "{% url 'blog:vote' pk=post.pk %}" "{% url 'blog:post_category' category.name %}"

2

如果你碰巧嵌套使用include(,命名空间会变得更加复杂,例如:topappname:appname:viewname


2

标签名称在应用程序包内的urls.py文件中必须是唯一的!这对于模板标记来路由什么和在哪里非常重要。

现在,在urls.py文件内部,您需要声明变量appName并为其分配唯一值。例如,在您的情况下,appName = "myApp";,同时[2]还需要定义urlpatterns列表...

urlpatterns = [..., url(r'^submit/$', views.submit, name='submit'), ...];

在 HTML 文件中仅需更改 URL 标签为:

<form action="{% url 'myHomeApp:submit' %}" method='post'>

这应该足够了,否则只需在此处编写,我们将查看如何继续进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接