Django Slug 引发错误 NoReverse Match
Django Slug raising error NoReverse Match
我正在开发一个 django 项目 (Django v2.0),它有来自不同组的用户,这个组是在用户配置文件中设置的。我想让网站更加个性化,并在用户登录后将用户组放在网站 url 的开头(通过 slug 添加)。
理想情况下,一旦他们登录,他们就会被重定向到带有 url 开头的那个 slug 的正确页面。在我访问用户组的登录页面中,这个组被称为并且从现在起将被称为 troop,以尽量减少与 Django 组的混淆。这是我的登录 class post 查看我检索此内容的位置:
def post(self, request):
def normal_user(user):
return user.groups.filter(name='Normal_User').exists()
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
if normal_user(user):
redirecting_url = 'accounts:home'
elif user.is_superuser:
redirecting_url = 'admin:index'
slug = user.userprofile.troop
return redirect(redirecting_url, slug=slug)
else:
form = AuthenticationForm()
error = True
args = {'form': form, 'error': error}
return render(request, self.template_name, args)
在这种情况下,我正在尝试访问我称为 "home" 并且在我的应用程序 "accounts".
中的 url "account"
我在应用程序帐户 views.py 中的主页功能有此代码:
def home(request, slug):
args = {'user': request.user}
return render(request, 'accounts/home.html', args)
除了在 url 中显示之外,我不想对 slug 做任何事情。
我的模板视图如下所示:
<div class="container">
<br>
<h2><strong>Your Progress:</strong></h2><br>
<h3>
<a href="{% url 'accounts:progress_page' slug=instance.slug %}" style="color:red"><strong>50% progress</strong></a>
<div class="progress">
<div class="progress-bar bg-danger progress-bar-striped progress-bar-
animated" role="progressbar" style="width:50%" aria-valuenow="50" aria-
valuemin="0" aria-valuemax="100">50%</div> </div>
</div></h3>
<br><br>
{% endblock %}
我的导航栏中也有一个 link 到 'home',我 link 它的方式与上面的 link 类似,使用 {% url 'accounts:home' 鼻涕虫 = instance.slug %}
我目前遇到以下错误:
“/BC/account/ 处的 NoReverseMatch
反向 'home' 关键字参数 '{'slug': ''}' 未找到。尝试了 1 种模式:['(?P[-a-zA-Z0-9_]+)/account/$']"
这种情况下的 slug 是 'BC'.
我的 urls.py 看起来像这样:
在根文件夹中:
main_urls = [
path('leaders/admin/', admin.site.urls),
path('account/', include('accounts.urls', namespace='accounts'))
]
urlpatterns = [
path('', include('home.urls', namespace='home_page')),
path('login/', include('login.urls', namespace='login')),
path('<slug:slug>/', include(main_urls))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我的 urls.py 在我的帐户应用程序中看起来像这样:
app_name="accounts"
urlpatterns = [
path('', views.home, name="home")
]
抱歉,描述太长了,但我一直在阅读所有可能的 site/video 我能在 Django slugs 上找到的东西,但还没有找到任何有用的东西。有人可以帮我解决这个问题吗?
您 url 的正则表达式要求 slug 至少有一个字符长。但是,您得到的异常表明 troop 名称(用作 slug
命名参数)为空:
Reverse for 'home' with keyword arguments '{'slug': ''}'
如果用户不需要 部队,在这种情况下,您只想将他重定向到 /accounts/
而不是 /troop/accounts
,我建议你为 accounts/$
添加一个单独的 URL,或者调整正则表达式以允许空 troop.
在查看我的代码后,我发现了一些有用的东西。这似乎是我应该能够拥有接受 slug 参数的视图,同时如果 slug 是空的,我仍然可以工作。为了解决这个问题,我所做的就是将视图函数定义中的 slug
部分更改为 **kwargs
。
然后我添加了一个变量,它访问了 slug 是什么,并在我有 link 时通过我的模板传递它。
例如:
def home(request, **kwargs):
slug = request.user.userprofile.troop
args = {'slug_arg': slug}
return render(request, 'accounts/home.html', args)
我的模板中的 link 看起来像这样:{% url 'accounts:home' slug=slug_arg %}
编辑
我发现问题是在我的渲染过程中,我应该能够穿过 slug,在这种情况下 slug=instance.slug
没有工作,有时会出现空的。但是,如果我在 slug=request.user.userprofile.troop
处拥有它,那么无需接受视图中的参数即可工作。
话虽如此,我无法为管理站点执行此操作,因为我不知道如何为管理员访问 views.py 并因此添加参数以接收 slug。
我正在开发一个 django 项目 (Django v2.0),它有来自不同组的用户,这个组是在用户配置文件中设置的。我想让网站更加个性化,并在用户登录后将用户组放在网站 url 的开头(通过 slug 添加)。
理想情况下,一旦他们登录,他们就会被重定向到带有 url 开头的那个 slug 的正确页面。在我访问用户组的登录页面中,这个组被称为并且从现在起将被称为 troop,以尽量减少与 Django 组的混淆。这是我的登录 class post 查看我检索此内容的位置:
def post(self, request):
def normal_user(user):
return user.groups.filter(name='Normal_User').exists()
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
if normal_user(user):
redirecting_url = 'accounts:home'
elif user.is_superuser:
redirecting_url = 'admin:index'
slug = user.userprofile.troop
return redirect(redirecting_url, slug=slug)
else:
form = AuthenticationForm()
error = True
args = {'form': form, 'error': error}
return render(request, self.template_name, args)
在这种情况下,我正在尝试访问我称为 "home" 并且在我的应用程序 "accounts".
中的 url "account"我在应用程序帐户 views.py 中的主页功能有此代码:
def home(request, slug):
args = {'user': request.user}
return render(request, 'accounts/home.html', args)
除了在 url 中显示之外,我不想对 slug 做任何事情。 我的模板视图如下所示:
<div class="container">
<br>
<h2><strong>Your Progress:</strong></h2><br>
<h3>
<a href="{% url 'accounts:progress_page' slug=instance.slug %}" style="color:red"><strong>50% progress</strong></a>
<div class="progress">
<div class="progress-bar bg-danger progress-bar-striped progress-bar-
animated" role="progressbar" style="width:50%" aria-valuenow="50" aria-
valuemin="0" aria-valuemax="100">50%</div> </div>
</div></h3>
<br><br>
{% endblock %}
我的导航栏中也有一个 link 到 'home',我 link 它的方式与上面的 link 类似,使用 {% url 'accounts:home' 鼻涕虫 = instance.slug %} 我目前遇到以下错误: “/BC/account/ 处的 NoReverseMatch 反向 'home' 关键字参数 '{'slug': ''}' 未找到。尝试了 1 种模式:['(?P[-a-zA-Z0-9_]+)/account/$']" 这种情况下的 slug 是 'BC'.
我的 urls.py 看起来像这样: 在根文件夹中:
main_urls = [
path('leaders/admin/', admin.site.urls),
path('account/', include('accounts.urls', namespace='accounts'))
]
urlpatterns = [
path('', include('home.urls', namespace='home_page')),
path('login/', include('login.urls', namespace='login')),
path('<slug:slug>/', include(main_urls))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我的 urls.py 在我的帐户应用程序中看起来像这样:
app_name="accounts"
urlpatterns = [
path('', views.home, name="home")
]
抱歉,描述太长了,但我一直在阅读所有可能的 site/video 我能在 Django slugs 上找到的东西,但还没有找到任何有用的东西。有人可以帮我解决这个问题吗?
您 url 的正则表达式要求 slug 至少有一个字符长。但是,您得到的异常表明 troop 名称(用作 slug
命名参数)为空:
Reverse for 'home' with keyword arguments '{'slug': ''}'
如果用户不需要 部队,在这种情况下,您只想将他重定向到 /accounts/
而不是 /troop/accounts
,我建议你为 accounts/$
添加一个单独的 URL,或者调整正则表达式以允许空 troop.
在查看我的代码后,我发现了一些有用的东西。这似乎是我应该能够拥有接受 slug 参数的视图,同时如果 slug 是空的,我仍然可以工作。为了解决这个问题,我所做的就是将视图函数定义中的 slug
部分更改为 **kwargs
。
然后我添加了一个变量,它访问了 slug 是什么,并在我有 link 时通过我的模板传递它。
例如:
def home(request, **kwargs):
slug = request.user.userprofile.troop
args = {'slug_arg': slug}
return render(request, 'accounts/home.html', args)
我的模板中的 link 看起来像这样:{% url 'accounts:home' slug=slug_arg %}
编辑
我发现问题是在我的渲染过程中,我应该能够穿过 slug,在这种情况下 slug=instance.slug
没有工作,有时会出现空的。但是,如果我在 slug=request.user.userprofile.troop
处拥有它,那么无需接受视图中的参数即可工作。
话虽如此,我无法为管理站点执行此操作,因为我不知道如何为管理员访问 views.py 并因此添加参数以接收 slug。