[英]django - Custom redirect after login
In my app I try to redirect after submitting a form, but it seems to does not work. 在我的应用中,我尝试在提交表单后重定向,但似乎不起作用。 Here is my urls.py
这是我的urls.py
from django.conf.urls import url
from po_contest_app import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^$', views.home, name='home'),
url(r'^signup/$', views.graduate_signup, name='signup'),
url(r'^signup/success/$', views.signup_success, name='signup_success')
]
and views.py. 和views.py。 The actual problem is in
graduate_signup
view. 实际的问题在
graduate_signup
视图中。 After receiving POST request I want to create a User and then save additional info about it. 收到POST请求后,我想创建一个User,然后保存有关它的其他信息。 For that purpose I use User Profile approach as described here :
为此目的,我使用用户个人资料的方法描述在这里 :
def graduate_signup(request):
if request.method == 'POST':
form = GraduateSignUpForm(request.POST)
print('POST has been received')
if form.is_valid():
user = form.save()
user.refresh_from_db() # load the profile instance created by the signal
user.graduate.birth_date = form.cleaned_data.get('birth_date')
user.save()
print('user is signed up')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=user.username, password=raw_password)
login(request, user)
print('user is signed in')
return redirect('signup_success')
else:
print('form has some errors')
print(form.errors)
else:
form = GraduateSignUpForm()
return render(request, 'graduate_signup.html', {'form': form})
def signup_success(request):
return render(request, 'signup_finished.html')
After submitting form in browser, I can see logs in Django console: 在浏览器中提交表单后,我可以在Django控制台中看到日志:
System check identified no issues (0 silenced).
January 19, 2018 - 08:05:32
Django version 1.11.7, using settings 'po_contest.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[19/Jan/2018 08:05:34] "GET / HTTP/1.1" 200 922
[19/Jan/2018 08:05:36] "GET /signup/ HTTP/1.1" 200 6484
POST has been received
user is signed up
user is signed in
[19/Jan/2018 08:05:56] "POST /signup/ HTTP/1.1" 302 0
[19/Jan/2018 08:05:56] "GET /signup/success/ HTTP/1.1" 200 758
However in browser I still see my signup page with the form, and no page I'm trying redirect to. 但是,在浏览器中,我仍然看到带有表单的注册页面,并且没有试图重定向到的页面。
My question: what can cause the problem? 我的问题:什么会引起问题?
The proper way to achieve this is to provide LOGIN_URL and LOGIN_URL_REDIRECT in settings.py
file of your project. 实现此目的的正确方法是在项目的
settings.py
文件中提供LOGIN_URL和LOGIN_URL_REDIRECT 。 And then provide some logic in confirmation, something like: 然后提供一些确认逻辑,例如:
def confirmation(request):
if request.method == 'POST':
form = ConfirmationForm(request.POST, instance=request.user)
if form.is_valid():
user.first_login = False
user.save()
return redirect('some_page')
else:
if not user.first_login:
login(request, request.user)
return redirect('some_page')
form = ConfirmationForm(instance=request.user)
context = {
'form': form,
}
return render(request, 'confirmation.html', context)
Instead of return redirect change it to HTTPResponseRedirect 代替返回重定向,将其更改为HTTPResponseRedirect
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
def graduate_signup(request):
if request.method == 'POST':
form = GraduateSignUpForm(request.POST)
print('POST has been received')
if form.is_valid():
user = form.save()
user.refresh_from_db() # load the profile instance created by the signal
user.graduate.birth_date = form.cleaned_data.get('birth_date')
user.save()
print('user is signed up')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=user.username, password=raw_password)
login(request, user)
print('user is signed in')
return HttpResponseRedirect('/signup/success/')
else:
print('form has some errors')
print(form.errors)
else:
form = GraduateSignUpForm()
return render(request, 'graduate_signup.html', {'form': form})
def signup_success(request):
return render(request, 'signup_finished.html')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.