django - 登录后自定义重定向

时间:2018-01-19 08:10:53

标签: python django http

在我的应用中,我尝试在提交表单后重定向,但似乎无法正常工作。 这是我的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

然而,在浏览器中,我仍然看到我的注册页面与表单,并没有我尝试重定向到的页面。

我的问题:什么可能导致问题?

2 个答案:

答案 0 :(得分:1)

实现此目的的正确方法是在项目的settings.py文件中提供LOGIN_URLLOGIN_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')