首页 > 解决方案 > 通过多个页面重定向(登录->注册->登录)而不会丢失django第一页中url的下一个参数

问题描述

我可能没有在标题中进行描述,但我想要的是例如当一个新用户打开一个需要登录的页面时——>他被重定向到登录页面,登录 url 具有上一页的下一个参数。但是由于他是新用户,他选择通过单击登录页面上的链接进行注册,该链接将他带到注册页面,现在这就是问题所在 - 注册网址没有参数,一旦用户注册,他就会自动重定向到登录页面,在他登录后,他被重定向到索引页面,而不是需要登录的页面。我有一个自定义用户模型,这是我的登录视图:

def login(request):
    if request.user.is_authenticated:
        return redirect('/')
    else:
        if request.method == "POST":
            email=request.POST['email']
            password=request.POST['password']
            user=auth.authenticate(email=email,password=password)
            if user is not None:
                auth.login(request, user)
                next_page = request.POST['next']
                if next_page != '':
                    return redirect(next_page)
                else:
                    return redirect('/')
            else:
                messages.info(request,"Email Password didn't match")
                next = request.POST['next']
                if next != '':
                    login_url = reverse('login')
                    query_string =  urlencode({'next': next})
                    url = '{}?{}'.format(login_url, query_string) # create the url
                    return redirect(url)
                else:
                    return redirect('login')
        else:
            return render(request,"login.html")

和注册视图:

def signup(request):
    next = request.GET.get('next', '')
    if request.user.is_authenticated:
        return redirect('/')
    else:
        if request.method == "POST":
            first_name=request.POST['first_name']
            last_name=request.POST['last_name']
            email=request.POST['email']
            mobile=request.POST['mobile']
            password=request.POST['password']
            cpassword=request.POST['cpassword']
            signup_uri = f'/signup?next={next}'

            if password==cpassword:
                if User.objects.filter(email=email).exists():
                    messages.info(request,'Email already in use')
                    return redirect(signup_uri)
                elif User.objects.filter(mobile=mobile).exists():
                    messages.info(request,'Mobile Number already in use')
                    return redirect(signup_uri)
                else:
                    user=User.objects.create_user(first_name=first_name,last_name=last_name,email=email,password=password,mobile=mobile)
                    user.save();
                    return redirect(f'/login?next={next}')
            else:
                messages.info(request,'Passwords not matching')
                return redirect('signup_uri')
        
        else:
            return render(request,'signup.html')

所以我想要的是:登录 url 中的下一个参数被带到注册 url,然后被带回登录 url,登录后用户可以从那里被重定向到下一页。很长一段时间以来我一直试图找出这个问题,但我无法找到任何解决方案,因此我们将不胜感激。谢谢

标签: django

解决方案


您可以通过作为查询字符串参数传递next给您的注册视图来完成此操作。

首先,您需要next在模板中添加注册链接,login.html在我的例子中如下所示:

<div>
Don't have an account?<a href="{% url 'signup' %}?next={{ next }}"> Sign Up</a>
</div>

然后,确保您将next作为上下文传递给您的模板login_view

def login_view(request):

    ...

    else:
        next = request.GET.get('next', '')
    render(request, 'login.html', {'next': next})

现在在您的 中signup_view,只需将next参数与您的重定向一起传递:

def signup_view(request):
    next = request.GET.get('next', '')
    if request.user.is_authenticated:
        return redirect(next)

    if request.method != "POST":
        return render(request, 'signup.html')

    first_name=request.POST['first_name']
    email=request.POST['email']
    password=request.POST['password']
    cpassword=request.POST['cpassword']

    signup_uri = f'signup?next={next}'

    if password != cpassword:
        messages.info(request,'Passwords not matching')
        return redirect(signup_uri)

    if User.objects.filter(email=email).exists():
        messages.info(request,'Email already in use')
        return redirect(signup_uri)
    else:
        user=User.objects.create_user(first_name=first_name,email=email,password=password)
        user.save();
        return redirect(f'/login?next={next}')

推荐阅读