我有一个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
。
答案 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
,避免混淆。