在url中使用django用户名,而不是id

dan*_*ana 3 django url friendly-url username

在迷你虚拟社区中,我有一个profile_view功能,以便我可以查看任何注册用户的个人资料.配置文件视图功能具有配置文件所属的用户的id作为参数,因此当我想访问用户2的配置文件时,我称之为:http://127.0.0.1: 8000 /账户/ 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)) 
Run Code Online (Sandbox Code Playgroud)

和我的网址:

urlpatterns = patterns('',
                        url(r'^profile_view/(?P<user>\d+)/$', 
                           profile_view,
                           name='profile_view'),
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Dan*_*man 24

您没有显示您尝试过的内容或遇到问题的地方.毕竟这很简单 - 只需将用户名字符串传递给函数而不是整数,然后根据它查找.

def profile_view(request, username):
    u = User.objects.get(username=username)
Run Code Online (Sandbox Code Playgroud)

并修改您的网址以允许字符串而不是整数:

url(r'^profile_view/(?P<username>\w+)/$', 
                       profile_view,
                       name='profile_view'),
Run Code Online (Sandbox Code Playgroud)

  • 根据我在django/contrib/auth/forms.py中看到的内容,我认为用于获取用户名的更好的正则表达式是(?P <用户名> [\ w.@ + - ] +) (11认同)

ger*_*ijk 11

这是我如何使用基于类的通用视图和slugs的使用.它非常简单,只需要几行代码就可以使用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>[\w.@+-]+)/$', UserProfileView.as_view()),
)
Run Code Online (Sandbox Code Playgroud)

现在,您既可以访问用户accounts/profile/id/123/,也可以访问accounts/profile/username/gertvdijk/.

这里发生了什么事?

  • 通常需要的pkURL参数被省略,并slug在URL模式中替换.这被观点所接受,因为......
  • sluView参数由DetailView(或任何其他基于SingleObjectMixin的视图)User.username使用,通过使用model = User和来查找对象slug_field = "username".(docs)
  • 因为slug字段是可选的,所以视图也很愉快地仅使用pk参数.

  • 如果用户名是.@ +中的任何一个,那么会发生什么情况,因为这些都不是slug中的有效字符? (2认同)

Sha*_*lal 7

在 urls.py 中

urlpatterns = [
    path('<str:username>/', UserDetailView.as_view(), name='user_detail'),
]
Run Code Online (Sandbox Code Playgroud)

具有基于类的视图。

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!!")
Run Code Online (Sandbox Code Playgroud)

我已经在 Django 2.1 中进行了测试。