通过多个页面重定向(登录-->;注册-->;登录),而不丢失django中第一页url的下一个参数

通过多个页面重定向(登录-->;注册-->;登录),而不丢失django中第一页url的下一个参数,django,Django,我可能没有在标题中进行说明,但我想要的是,例如,当一个新用户打开一个需要登录的页面-->时,他会被重定向到登录页面,并且登录url具有上一页面的下一个参数。但是,由于他是一个新用户,他选择通过单击登录页面上的链接进行注册,该链接将引导他注册页面,现在问题来了-注册url没有参数,一旦用户注册,他会自动重定向到登录页面,在他登录后,他会重定向到索引页面,而不是需要登录的页面。我有一个自定义用户模型,这是我的登录视图: def login(request): if request.user.

我可能没有在标题中进行说明,但我想要的是,例如,当一个新用户打开一个需要登录的页面-->时,他会被重定向到登录页面,并且登录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,用户登录后可以从那里重定向到下一个页面。我一直试图找出这个问题,从很长一段时间以来,现在,但我无法找到任何解决方案,所以任何帮助将不胜感激。谢谢

我假设在您的
login.html
模板中有一个注册链接(例如
/signup
)。您所需要做的就是读取您在
登录
视图中获得的下一个查询参数的值,并将其传递给您的
登录.html
模板,这样您就可以创建一个注册链接,如
/signup?next=next\u值
。然后,可以在注册视图中读取
next
query param的值,如果用户创建成功,我们可以按如下方式修改代码:

# User has been created
if next_value:
    return redirect(next_value)
else:
   return redirect('/login/')

您可以通过将
next
作为querystring参数传递到注册视图来实现这一点

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

<div>
Don't have an account?<a href="{% url 'signup' %}?next={{ next }}"> Sign Up</a>
</div>
现在,在您的
注册\u视图中
,只需将
下一步
参数与重定向一起传入即可:

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}')

但在我的网站中,用户必须在注册后登录,因此注册后,他应该被重定向到登录页面,并从那里重定向到产品视图页面。您可以重定向到/login?next=next_值,应该是fine。在登录视图的上下文中传递next时会发生什么?我在问题中更新了我的注册视图。我所面临的问题是,当我在请求后
print(next)
就在
def signup
下面时,GET it会正确地打印我需要的内容,但是这个next不会显示在signup_uri以及
f'/login?next={next}'
@VATSALJAIN中,首先,你不应该传递一个字符串来重定向。因此,行:
return redirect('signup_uri')
应该是:
return redirect(signup_uri)
@VATSALJAIN同样,当您
打印(redirect_uri)
时会发生什么?
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}')