2010-06-10 57 views
3

在迷你虚拟社区中,我有一个profile_view函数,以便我可以查看任何注册用户的配置文件。配置文件视图功能有一个参数作为该配置文件所属用户的id,所以当我想要访问用户2的配置文件例如,我这样称呼它: http://127.0.0.1:8000/accounts/profile_view/2/django用户名在url中,而不是id

我的问题是,我想在URL中有用户名,而不是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'), 

在此先感谢!

回答

19

你不显示你已经尝试过什么,或者你有什么困难。毕竟这是相当简单的 - 只需将一个用户名字符串传递给该函数而不是一个整数,然后根据它查找。

def profile_view(request, username): 
    u = User.objects.get(username=username) 

和修改网址,让字符串,而不是整数:

url(r'^profile_view/(?P<username>\w+)/$', 
         profile_view, 
         name='profile_view'), 
+10

根据我在django/contrib/auth/forms.py中看到的,我认为使用更好的正则表达式来获取用户名是 (?P [\ w。@ + - ] +) – 2011-04-16 01:04:29

+0

如果用户名是一封电子邮件,你不希望这个信息是公开的吗?你可以使用用户的名字和姓氏,但这可能是重复的,所以我认为我们应该在ID上添加一个ID或一个哈希值 – jobima 2014-07-18 10:40:27

2

添加到文件的顶部:

from django.shortcuts import get_object_or_404 

并更换

u = User.objects.get(pk=user) 

u = get_object_or_404(User, <login>=user) 

其中登录是用户模型中的用户名字段。

+0

我已经替换,就像你说的,它说我有一个语句错误在线“u = User.objects。get( = user) “ – dana 2010-06-10 09:29:15

+1

用用户名字段的名称替换登录名,我不知道它是如何调用的,也请看其他答案并修复url。 – 2010-06-10 09:32:44

+0

是的,就是这样!谢谢! – dana 2010-06-10 09:35:09

9

这里是我如何做到这一点使用基于类的通用视图和使用蛞蝓。这非常简单,只需要几行代码就可以在slug的帮助下完成。

# 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>[\[email protected]+-]+)/$', UserProfileView.as_view()), 
) 

现在您可以访问既喜欢accounts/profile/id/123/以及accounts/profile/username/gertvdijk/用户。

这里发生了什么?

  • 通常需要的网址参数pk被忽略,并以URL模式中的slug取代。这被视图所接受,因为...
  • 通过使用model = Userslug_field = "username",DetailView(或任何其他基于SingleObjectMixin的视图)正在使用slug参数来查找User.username上的对象。 (docs
  • 因为slug字段是可选的,所以视图也很乐意使用pk参数。
+1

会发生什么情况用户名有。@ +,因为这些在slug中不是有效的字符? – rozzy 2014-04-30 08:47:05

+0

如何在扩展User到UserProfile的情况下做到这一点(您知道ge为用户提供更多的字段)。用户模型具有“用户名”字段,但UserProfile模型具有我想要显示的自定义字段。 – RicardoGonzales 2014-09-14 22:02:37

+0

@RicardoGonzales这很简单...改变'model'和'slug_field'。适用于每个Django模型,这个配方,不仅仅是用户的。 – gertvdijk 2014-09-15 07:22:28

相关问题