2

到目前为止,我一直(pk)在我的应用程序的配置文件 URL 中使用用户 ID 作为参数。最近我决定使用username而不是用户ID所以我更改了以下内容:

网址.py

# This was what i was using previously
url(r'^profile/(?P<uid>\d+)/$', 'app.views.user_profile', name="profile"),

# Changed the above to this.
url(r'^profile/(?P<username>[-\w\d]+)/$', 'app.views.user_profile', name="profile"),

视图.py

# Previous view
@login_required
def user_profile(request, uid):

    user = get_object_or_404(models.User, pk=uid)
    profile = helpers.get_profile(user)
    render_to_response('profile.html', {'profile' : profile})


# Changed the above to
@login_required
def user_profile(request, username):

    user = get_object_or_404(models.User, username=username)
    profile = helpers.get_profile(user)
    render_to_response('profile.html', {'profile' : profile})

直到现在一切都很好。当我尝试访问127.0.0.1:8000/profile/some_username/而不是以前的访问时,127.0.0.1:8000/profile/some_number/它工作正常。

我在 中有一个工具栏profile.html,其中包含以下链接:

/profile/edit/
/profile/settings/

urls.py这些 url 中映射到非常简单的视图。比如下面这样。

@login_required
def profile_settings(request):
    """  
    This view helpers.renders the profile's settings panel
    """
    print 'hello'
    rec, can = helpers.get_user_or_noprofile(request.user)
    if not can is None:
        gform = forms.CandidateGeneralSettingsForm(instance=can)
        jsform = forms.CandidateJobSearchSettingsForm(instance=can)
        data = {'candidate' : can, 'gform' : gform, 'jsform' : jsform }
    else:
        form = forms.RecruiterSettingsForm(instance=rec)
        data = { 'recruiter' : rec, 'form' : form }
    return helpers.render(request, 'profile_settings.html', data)

奇怪的部分是在我更改为username在个人资料网址中使用之后。只要我单击工具栏中的任何链接,我就会看到该404 : Error : No User matches the given query.页面。

为了调试,我尝试在这些视图中打印一些调试语句,并发现了一些更奇怪的东西。即使我在视图中注释了整个代码并且只写了一条打印语句,也没有打印任何内容。

这让我怀疑问题可能出在login_required装饰器上。但如果是这种情况,它在 visitng 时如何工作127.0.0.1:8000/profile/some_username/

我真的想不出任何可能导致这种情况的原因。任何帮助将不胜感激。谢谢。

PS:另外,JFYI,我正在使用自定义电子邮件身份验证后端,它允许用户通过他们的电子邮件地址而不是用户名登录。

4

1 回答 1

4

它不起作用,因为edit它不是有效的用户名。

此 url/profile/edit/匹配^profile/(?P<username>[-\w\d]+)/$,并username变为edit.

由于您没有名为“edit”的用户,因此此操作user = get_object_or_404(models.User, username=username)失败并引发404.

对于/profile/settings/.

于 2012-12-26T09:02:04.520 回答