Django用户配置文件的URL中的用户名

时间:2014-03-16 15:34:45

标签: regex django python-2.7 user-profile

我有一个Django项目,它使用配置文件来获取用户信息。除了一个方面,事情有点工作......以下是描述我的问题的代码片段。

在模板中:

<li><a href="/accounts/{{ user.username }}/profile/">Profile</a></li>

在views.py

class UserProfileView(View):
    @method_decorator(login_required)
    def get(self, request, user):
        profile = get_object_or_404(UserProfile, user=request.user)
        return render(request, 'accounts/profile.html', {'profile': profile})

在urls.py

url(r'^accounts/(?P<user>.+)/profile/$', 
    UserProfileView.as_view(),  
    name='user_profile_view'
),

我已尝试过命名组的变体,这就是我发现的工作方式。问题是,我可以使用/accounts//profile/之间的任何字符串(显然),它可以工作。我想要实现的是只让当前用户的用户名在URL中有效,否则抛出404

1 个答案:

答案 0 :(得分:2)

您真的需要个人资料网址中的用户参数吗?如果您只希望它适用于当前用户,那么为什么不简单地删除user参数:

# urls.py
url(r'^accounts/profile/$', 
    UserProfileView.as_view(),  
    name='user_profile_view'
),

# views
class UserProfileView(View):
    @method_decorator(login_required)
    def get(self, request):
        profile = get_object_or_404(UserProfile, user=request.user)
        return render(request, 'accounts/profile.html', {'profile': profile})

在您发布的代码中,UserProfileView.get方法无论如何都没有使用user参数。

<强>更新

如果您想保留user参数并使其按照您想要的方式工作,您可以更改视图:

from django.http import Http404

class UserProfileView(View):
    @method_decorator(login_required)
    def get(self, request, user):
        if request.user.username == user:
            profile = get_object_or_404(UserProfile, user=request.user)
            return render(request, 'accounts/profile.html', {'profile': profile})
        else:
            raise Http404

顺便说一句,因为user方法的参数列表中的get实际上只是用户名而不是用户对象,所以最好将其重命名为username,避免混淆。