在迷你虚拟社区中,我有一个profile_view功能,以便我可以查看任何注册用户的个人资料。配置文件视图功能具有配置文件所属的用户的id作为参数,因此当我想访问用户2的配置文件时,我将其称为: http://127.0.0.1:8000/accounts/profile_view/2/
我的问题是我想在网址中输入用户名,而不是ID。 我尝试按如下方式修改我的代码,但它仍然不起作用。这是我的代码:
视图:
def profile_view(request, user):
u = User.objects.get(pk=user)
up = UserProfile.objects.get(created_by = u)
cv = UserProfile.objects.filter(created_by = User.objects.get(pk=user))
blog = New.objects.filter(created_by = u)
replies = Reply.objects.filter(reply_to = blog)
vote = Vote.objects.filter(voted=blog)
following = Relations.objects.filter(initiated_by = u)
follower = Relations.objects.filter(follow = u)
return render_to_response('profile/publicProfile.html', {
'vote': vote,
'u':u,
'up':up,
'cv': cv,
'ing': following.order_by('-date_initiated'),
'er': follower.order_by('-date_follow'),
'list':blog.order_by('-date'),
'replies':replies
},
context_instance=RequestContext(request))
和我的网址:
urlpatterns = patterns('',
url(r'^profile_view/(?P<user>\d+)/$',
profile_view,
name='profile_view'),
提前感谢!
答案 0 :(得分:22)
您没有显示您尝试过的内容或遇到问题的地方。毕竟这很简单 - 只需将用户名字符串传递给函数而不是整数,然后根据它查找。
def profile_view(request, username):
u = User.objects.get(username=username)
并修改您的网址以允许字符串而不是整数:
url(r'^profile_view/(?P<username>\w+)/$',
profile_view,
name='profile_view'),
答案 1 :(得分:9)
以下是我使用基于类的通用视图和slugs的使用方法。它非常简单,只需要几行代码就可以使用slugs。
# accounts/views.py
from django.contrib.auth.models import User
from django.views.generic.detail import DetailView
class UserProfileView(DetailView):
model = User
slug_field = "username"
template_name = "userprofile.html"
# accounts/urls.py
from views import UserProfileView
urlpatterns = patterns('',
# By user ID
url(r'^profile/id/(?P<pk>\d+)/$', UserProfileView.as_view()),
# By username
url(r'^profile/username/(?P<slug>[\w.@+-]+)/$', UserProfileView.as_view()),
)
现在,您可以访问accounts/profile/id/123/
以及accounts/profile/username/gertvdijk/
等用户。
这里发生了什么?
pk
网址参数,并在网址格式中替换为slug
。视图接受了这一点,因为...... User.username
和model = User
,DetailView(或任何其他基于SingleObjectMixin的视图)使用slug参数来查找slug_field = "username"
上的对象。 (docs)pk
参数。答案 2 :(得分:2)
在文件顶部添加:
from django.shortcuts import get_object_or_404
并替换
u = User.objects.get(pk=user)
与
u = get_object_or_404(User, <login>=user)
其中登录是用户模型中的用户名字段。
答案 3 :(得分:0)
对于Django 2.0及更高版本:
path(‘profile/<username>/, views.profile, name=‘profile’),
答案 4 :(得分:0)
在urls.py
中urlpatterns = [
path('<str:username>/', UserDetailView.as_view(), name='user_detail'),
]
具有基于类的视图。
class UserDetailView(LoginRequiredMixin, DetailView):
model = User
slug_field = "username"
slug_url_kwarg = "username"
template_name = "account/user_detail.html"
def get_object(self):
object = get_object_or_404(User, username=self.kwargs.get("username"))
# only owner can view his page
if self.request.user.username == object.username:
return object
else:
# redirect to 404 page
print("you are not the owner!!")
我已经在Django 2.1中进行了测试。