Django为用户配置文件创建自定义URL
Posted
技术标签:
【中文标题】Django为用户配置文件创建自定义URL【英文标题】:Django Creating custom URL for user profile 【发布时间】:2013-04-05 18:26:18 【问题描述】:我有一个应用程序允许用户创建个人资料并登录。
当用户登录时,他被重定向到 127.0.0.1:8000/profile/
问题是,我想通过将用户的用户名添加到 URL 的末尾来自定义 URL,例如 127.0.0.1:8000/profile/michael
这个问题和我的类似
Django - after login, redirect user to his custom page --> mysite.com/username
“获取用户名,然后对自定义 URL 执行 HttpResponseRedirect。”
我似乎无法弄清楚如何将用户名作为参数传递给 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'
),
新
我的意见.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)
【问题讨论】:
【参考方案1】:这将是您重定向 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/
。
【讨论】:
您的格式错误。您还应该在返回之外执行此操作,以提高可读性。formatted_string = "/profile/?0=1".format(username, request.path)
然后return HttpResponseRedirect(formatted_string)
。
让我们continue this discussion in chat【参考方案2】:
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())
【讨论】:
以上是关于Django为用户配置文件创建自定义URL的主要内容,如果未能解决你的问题,请参考以下文章