如何在django中重写基本URL以在所有页面的url中添加登录的用户名而不是app name?

Har*_*mer 3 django url-rewriting python-2.7

我正在研究django应用程序,我有如下应用程序的基本URL:

127.0.0.1:8000/myblog/page
Run Code Online (Sandbox Code Playgroud)

其中127.0.0.1:8000是基本URL,myblog是应用程序名称,页面是页面名称.所以我的要求是在不改变应用程序内部代码的情况下将url更改为这样的内容:

127.0.0.1:8000/username/page
Run Code Online (Sandbox Code Playgroud)

基本上我想在URL中用用户名更改App名称.我已经尝试过在这个 SO问题中给出的解决方案.但它并没有多大帮助.

Iva*_*kin 9

您可以将用户名传递给urlregexp args并从request类获取请求用户:
view:

def user_page(request, username):
    try:
        user = User.objects.get(username=username)
    except User.DoesNotExists:
        raise Http404
    # or use shortcut get_object_or_404(User, username=username)
    if request.user.username != user.username:
        raise Http404
    return render(request, 'templates/user_template', {'user':user})
Run Code Online (Sandbox Code Playgroud)

网址:

url(r'^(?<username>\w+)/page/$', views.user_page, name='user_page')
Run Code Online (Sandbox Code Playgroud)

注意:username字段无效选择,如果它不是唯一的,当您从多个用户获得时,它将产生错误User.objects.get().更好地使用pk字段进行用户页面查找.

但是为请求用户构建用户页面有更简单的方法.只有一个没有关键字参数的URL,它为经过身份验证的用户响应数据:

视图:

def user_page(request):
    user = None
    if request.user.is_authenticated():
        user = User.objects.get(pk=request.user.pk)
    return render(request, 'templates/user_template', {'user': user} )
Run Code Online (Sandbox Code Playgroud)

网址:

url(r'^page/$', views.user_page, name='user_page')
Run Code Online (Sandbox Code Playgroud)

现在它根据请求用户返回数据,或者None用户未经过身份验证