在我的应用中,我尝试在提交表单后重定向,但似乎无法正常工作。 这是我的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')
]
和views.py。实际问题出在graduate_signup
视图中。收到POST请求后,我想创建一个用户,然后保存有关它的其他信息。为此,我使用了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')
在浏览器中提交表单后,我可以在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
然而,在浏览器中,我仍然看到我的注册页面与表单,并没有我尝试重定向到的页面。
我的问题:什么可能导致问题?
答案 0 :(得分:1)
实现此目的的正确方法是在项目的settings.py
文件中提供LOGIN_URL和LOGIN_URL_REDIRECT。然后在确认中提供一些逻辑,例如:
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)
答案 1 :(得分:0)
而不是返回重定向,将其更改为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')