Django Slug引发错误NoReverse Match

时间:2018-05-16 09:53:52

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

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

理想情况下,一旦他们登录,他们就会被重定向到右侧页面,并在网址的开头加上该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)

在这种情况下,我正在尝试访问我称为“家”的网址“帐户”,并且在我的应用“帐户”中。

应用帐户中views.py中的我的家庭功能有以下代码:

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 at / BC / account / 使用关键字参数'{'slug':''}'找不到'home'。尝试了1种模式:['(?P [-a-zA-Z0-9 _] +)/ account / $']“ 这种情况下的slu is是'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上找到的所有可能的网站/视频,但却找不到任何有效的网站/视频。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您网址的正则表达式要求slug长度至少为一个字符。但是,您获得的异常表明部队名称(用作slug命名参数)为空:

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

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

答案 1 :(得分:0)

在探索我的代码后,我发现了一些有用的东西。这似乎是我应该能够获得一个视图,这些视图会在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,在这种情况下slug=instance.slug无效,有时会变空。但是,如果我在slug=request.user.userprofile.troop处拥有它,则无需接受视图中的参数即可工作。

在说过这样的话后,我无法为管理站点执行此操作,因为我不知道如何访问管理员的views.py,因此添加参数以获取slug。