2013-04-13 28 views
1

我有一个应用程序,它允许用户创建一个配置文件,并登录。Django的创建自定义URL

当用户登录时,他将被重定向到127.0.0.1:8000/profile/

问题是,我想加入的用户的用户名到URL如示例的末尾127.0.0.1:8000/profile/michael

这是自定义URL类似的问题来挖掘

Django - after login, redirect user to his custom page --> mysite.com/username

“获取用户名,然后执行HttpResponseRedirect到自定义URL。”

我似乎无法弄清楚如何将用户名作为参数传递给HttpResponseRedirect以正确处理自定义URL。

return HttpResponseRedirect('/profile/?username=%s' % (username, request.path)) 


def Profile(request): 
    if not request.user.is_authenticated(): 
     return HttpResponseRedirect(reverse('world:LoginRequest')) 
    person = Person.objects.get(user=request.user) 
    return render(request,'profile.html',{'person':person}) 

我的网址

url(
    r'^profile/$', 
    'pet.views.Profile', 
    name = 'Profile' 
), 

我views.py

def LoginRequest(request): 
if request.user.is_authenticated(): 
     username = User.objects.get(username=request.user) 
     url = reverse('Profile', kwargs = {'username': username.username}) 
     return HttpResponseRedirect(url)   
if request.method == "POST": 
    form = LoginForm(request.POST) 
    if form.is_valid(): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 
     Person = authenticate(username=username, password=password) 
     if Person is not None: 
      login(request, Person) 
      username= User.objects.get(username=request.user) 

          url = reverse('Profile', kwargs = {'username': username.username}) 
          return HttpResponseRedirect(url) 


return render(request, 'login.html',{'form': LoginForm()}) 




url(
    r'^login/$', 
    'pet.views.LoginRequest', 
    name = 'LoginRequest' 
), 

url(
    r'^profile/(?P<username>\w+)/$', 
    'pet.views.Profile', 
    name = 'Profile' 
), 


def Profile(request,username): 
    if not request.user.is_authenticated(): 
     return HttpResponseRedirect(reverse('world:LoginRequest')) 
    board = Board.objects.filter(user=request.user) 

    person = Person.objects.get(user__username=username) 
    return render(request,'profile.html',{'board':board ,'person':person}) 

回答

3

这将是您的重定向URL,即正确的正则表达式。不要修改你拥有的那个。

url(r'^profile/(?P<username>\w+)/$', 'pet.views.myprofileview', name="detail_profile") 

然后将参数传递到重定向:

url = reverse('detail_profile', kwargs={'username': profile.firstname}) 
return HttpResponseRedirect(url) 

这导致了也不必定义一个新的观点:

def myprofileview(request, username): 
    person = Person.objects.get(user = request.user) 
    return render(request,'profile.html',{'person':person}) 

这将消除在一个视图两种行为,我发现它非常好!

我们这样做是因为它是一个HttpResponseRedirect接受的字符串,所以我们必须相应地构建它。

这将使重定向到myprofileview视图和“风格”,如果你可以称之为,你的网址/profile/michael/

+0

你格式错了。你也应该在回报之外做到这一点,它更好的可读性。 'formatted_string =“/profile/?{0}={1}".format(username,request.path)''然后'返回HttpResponseRedirect(formatted_string)'。 –

+0

@ donkeyboy72我更新了我的答案。 –

+0

@ donkeyboy72你有一个用户名用户名limelights? –

1
def LoginRequest(request): 
    if request.user.is_authenticated(): 
     return HttpResponseRedirect(reverse('world:Profile', 
      kwargs={'username': request.user.username})) 

    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 

      Person = authenticate(username=username, password=password) 
      if Person is not None: 
       login(request, Person) 

       return HttpResponseRedirect(reverse('world:Profile', 
        kwargs={'username': username})) 

    return render(request, 'login.html',{'form': LoginForm()}) 
+0

@ donkeyboy72 ok – catherine