django 不重定向到下一页需要登录

问题描述 投票:0回答:1

我有多个视图函数,在我的 view.py 中有

@login_required
装饰器。当我注销并尝试访问其视图功能具有
@login_required
装饰器的页面之一时,我被重定向到具有这种 url 的页面。
http://localhost:8002/signin/?next=/pending/
。但是,当我登录时,我被重定向到索引页面而不是待定页面,我已经尝试使用 this questionthis question 的解决方案来解决我的问题,但它不起作用。

这是我的登录视图函数

def signin(request):
    if request.user.is_authenticated:
        return redirect(index)
    if request.method == "POST":
        form = Signin(request.POST)
        if form.is_valid():
            username = request.POST.get("username")
            password = request.POST.get("password")

            user = User.objects.filter(username=username.lower()).exists()
            if user:
                get_user = User.objects.filter(username=username.lower())
                check_pass = check_password(password, get_user[0].password)
                if not check_pass:
                    messages.error(request, "Invalid Credentials")
                    return redirect(signin)
                else:
                    login(request, get_user[0])
                    return redirect(index)
            else:
                messages.error(request, "Invalid Credentials")
                return redirect(signin)
    else:
        form = Signin()
        return render(request, "accounts/login.html", {"form": form})

这是我的 urls.py

from django.urls import path

from accounts import views


urlpatterns = [
    path("signup/", views.signup, name="signup"),
    path("signin/", views.signin, name="signin"),
    path("signout/", views.signout, name="signout"),

这是我的登录模板

<!DOCTYPE html>
<html lang="en" class="supernova login-page">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SignIn</title>

<link rel="stylesheet" href="/static/signup/css/1.css">
<link rel="stylesheet" href="/static/signup/css/2.css">
<link rel="stylesheet" href="/static/signup/css/3.css">
<link rel="stylesheet" href="/static/signup/css/4.css">
<link rel="stylesheet" href="/static/signup/css/5.css">
<link rel="stylesheet" href="/static/signup/css/6.css">
<link rel="stylesheet" href="/static/signup/css/main.css">
<link rel="shortcut icon" href="/static/img/icons/favicon.ico" type="image/x-icon">


</head>
<body>
<form class="jotform-form" action="/signin/" method="post" enctype="multipart/form-data" name="form_230023299150548" id="230023299150548" accept-charset="utf-8" autocomplete="on">
  {% csrf_token %}
  
  <div role="main" class="form-all">
    <ul class="form-section page-section main-page login-section">
      <li id="cid_60" class="form-input-wide" data-type="control_head">
        <div class="form-header-group  header-small">
          <div class="header-text httal htvam">
            <h3 id="header_60" class="form-header" data-component="header">Login</h3>
          </div>
        </div>
      </li>

      <li class="form-line jf-required" data-type="control_textbox" id="id_64">
        <label class="form-label form-label-left" id="label_64" for="input_64"> Username
          <span class="form-required">*</span>
        </label>
        <div id="cid_64" class="form-input jf-required">
          {{form.username}}
        </div>
      </li>

      <li class="form-line jf-required" data-type="control_fullname" id="id_66">
        <label class="form-label form-label-left form-label-auto" id="label_66" for="first_66">Password
          <span class="form-required">*</span>
        </label>
        <div id="cid_66" class="form-input jf-required">
          <div data-wrapper-react="true">
            <span class="form-sub-label-container" style="vertical-align:top" data-input-type="first">
              {{form.password}}
            </span>
        </div>
      </li>
      <input type="hidden" name="next" value="{{ next }}">
     
      <li class="form-line" data-type="control_button" id="id_76">
        <div id="cid_76" class="form-input-wide">
          <div data-align="center" class="form-buttons-wrapper form-buttons-center   jsTest-button-wrapperField"><button id="input_76" type="submit" class="form-submit-button submit-button jf-form-buttons jsTest-submitField" data-component="button" data-content="">Submit</button></div>
        </div>
      </li>
      <div class="messages">
        {% for message in messages %}
          <p class="message">{{message}}</p>
        {% endfor %}
      </div>
    </ul>
  </div>
  <div class="redirect">
    <p class="redirect-p">
      <a href="/signup/">Click here to register</a>
    </p>
  </div>
  <!-- <div class="formFooter-heightMask"></div>
  <div class="formFooter f6 branding21"></div> -->
</form>
<script src="/static/signup/js/1.js"></script>
<script src="/static/signup/js/2.js"></script>
<script src="/static/signup/js/3.js"></script>
<script src="/static/signup/js/4.js"></script>
<script src="/static/signup/js/5.js"></script>
<script src="/static/signup/js/6.js"></script>
</body>
</html>

那么我该怎么做才能将我重定向到下一页而不是索引页。

python django django-views django-templates next
1个回答
0
投票

这不是您验证用户和重定向的正确方式。成功登录后,您已重定向到索引页面。要重定向到下一页,您可以尝试:

redirect_url = request.GET.get('next')
return redirect(redirect_url)

signin 视图应该是这样的: 从 django.contrib.auth 导入验证

def signin(request):
    if request.user.is_authenticated:
        return redirect(index)
    if request.method == "POST":
        form = Signin(request.POST)
        if form.is_valid():
            username = request.POST.get("username")
            password = request.POST.get("password")
            redirect_url = request.GET.get("next")

            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    messages.success(request, "You have logged in!")
                    
                    if redirect_url:
                        return redirect(redirect_url)
                    else:
                        return redirect('index')
                else:
                    messages.warning(request, "Your account is disabled!")
            else:
                messages.error(request, "Invalid Credentials")
    else:
        form = Signin()
    
    return render(request, "accounts/login.html", {"form": form})

或者你可以使用 Django 内置的 LoginView。在你的 urls.py 中导入 LoginView 并添加到这样的路径:

from django.contrib.auth.views import LoginView

urlpatterns = [
    # Other urls
    path('login/', LoginView.as_view(template_name='accounts/login.html'), name='signin'),
]

LoginView 的 Django 官方文档。 检查文件

© www.soinside.com 2019 - 2024. All rights reserved.