简体   繁体   English

django-登录后自定义重定向

[英]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_URLLOGIN_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM