【问题标题】:Django Slug raising error NoReverse MatchDjango Slug 引发错误 NoReverse Match
【发布时间】:2018-10-26 07:40:06
【问题描述】:

我正在开发一个 django 项目(Django v2.0),它有来自不同组的用户,这个组是在用户配置文件中设置的。我想让网站更加个性化,并在用户登录后将用户组放在网站 url 的开头(通过 slug 添加)。

理想情况下,一旦他们登录,他们就会被重定向到正确的页面,并在 url 的开头使用那个 slug。在我访问用户组的登录页面中,这个组被称为并且从现在开始将被称为部队,以尽量减少与 Django 组的混淆。这是我在其中检索到的登录类帖子视图:

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中的home函数有这个代码:

def home(request, slug):

args = {'user': request.user}
return render(request, 'accounts/home.html', args)

我不想对 slug 做任何事情,除了在 url 中显示它。 我的模板视图如下所示:

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

我的导航栏中还有一个指向“home”的链接,我以与上面的链接类似的方式链接它,使用 {% url 'accounts:home' slug = instance.slug %} 我目前遇到以下错误: "NoReverseMatch 在 /BC/account/ 找不到关键字参数“{'slug':''}' 的“home”。尝试了 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")
]

抱歉,描述太长了,但我一直在阅读我在 Django slugs 上可以找到的所有可能的站点/视频,但还没有找到任何可行的方法。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python django django-templates django-urls slug


    【解决方案1】:

    您的 url 正则表达式要求 slug 至少有一个字符长。但是,您得到的异常表明 troop 名称(用作 slug 命名参数)为空:

    Reverse for 'home' with keyword arguments '{'slug': ''}'
    

    如果用户不需要部队,在这种情况下你只想将他重定向到/accounts/而不是/troop/accounts,我建议你添加一个单独的URL accounts/$,或调整正则表达式以允许空部队

    【讨论】:

    • 嗨萨姆,谢谢你的建议。如果它只是account/$,我添加了一个网址,但遗憾的是这似乎并不能解决问题。这是因为 slug 在 url 中,但似乎我的观点没有接受它。尽管如果我在视图中删除 slug 参数,我确实会收到一条错误消息:home() got an unexpected keyword argument 'slug',所以我认为有些事情正在发生。
    • 如果您为同一个视图添加第二个正则表达式,但它与视图接受的参数数量不匹配,这就是您得到的错误。为您的视图方法提供 slug 的默认值,或在 URL 定义中提供默认值。
    【解决方案2】:

    在浏览了我的代码后,我发现了一些可行的方法。这似乎是我应该能够拥有在 slug 为空的情况下仍然可以工作的观点。为了解决这个问题,我所做的只是将视图函数定义中的slug 部分更改为**kwargs。 然后我添加了一个变量,它可以访问 slug 是什么,并在我有链接时通过我的模板传递它。 例如:

    def home(request, **kwargs):
        slug = request.user.userprofile.troop
        args = {'slug_arg': slug}
        return render(request, 'accounts/home.html', args)
    

    我的模板中的链接如下所示:{% url 'accounts:home' slug=slug_arg %}


    编辑 我发现问题在于,在我的渲染过程中,我应该能够通过蛞蝓,在这种情况下,slug=instance.slug 无法正常工作,有时会显示为空。但是,如果我在 slug=request.user.userprofile.troop 拥有它,那么它无需接受来自视图的参数即可工作。


    话虽如此,但我无法为管理站点执行此操作,因为我不知道如何为管理员访问 views.py 并因此添加参数以获取 slug。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多