簡體   English   中英

Ajax 調用不調用 Django 中的視圖函數

[英]Ajax call not calling view function in Django

我正在嘗試在 Django 中構建一個登錄表單,當用戶點擊登錄時,我希望發送用戶名和密碼來檢查它是哪種類型的用戶,因為我的系統有 3 種不同類型的用戶。

以下是代碼:

視圖.py

from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User



def index(request):
    return render(request, "login.html")


@csrf_protect
def auth_login(request):
    print("Hello !")
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    group = User.objects.get(username=username).groups.values()[0]['name']
    print(username)
    print(user)
    print(password)
    return render(request, "add_form.html")


@csrf_protect
def logout(request):
    logout(request)

login.html - (我有一個簡單的引導登錄表單)

<!DOCTYPE html>
<html lang="en">
<head>
    {% load staticfiles %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <title>Login</title>

<style>
        html,
body {
  height: 100%;
}

body {
  display: -ms-flexbox;
  display: -webkit-box;
  display: flex;
  -ms-flex-align: center;
  -ms-flex-pack: center;
  -webkit-box-align: center;
  align-items: center;
  -webkit-box-pack: center;
  justify-content: center;
  padding-top: 40px;
  padding-bottom: 40px;
  background-color: white;
}

.form-signin {
  width: 100%;
  max-width: 330px;
  padding: 15px;
  margin: 0 auto;
}
.form-signin .checkbox {
  font-weight: 400;
}
.form-signin .form-control {
  position: relative;
  box-sizing: border-box;
  height: auto;
  padding: 10px;
  font-size: 16px;
}
.form-signin .form-control:focus {
  z-index: 2;
}
.form-signin input[type="text"] {
  margin-bottom: -1px;
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
  margin-bottom: 10px;
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}
    </style>
</head>
<body class="text-center">
   <form class="form-signin" id="login-form">{% csrf_token %}
      <img class="mb-4" src="{% static "download.png" %}" alt="Logo"  align="center" height="112" width="112">
      <h1 class="h3 mb-4 font-weight-normal">Please sign in</h1>
      <label for="inputEmail" class="sr-only">Username</label>
      <input type="text" id="uname" class="form-control" placeholder="Username" required autofocus>
      <label for="inputPassword" class="sr-only">Password</label>
      <input type="password" id="passwd" class="form-control" placeholder="Password" required>
      <div class="checkbox mb-4">
      </div>
      <button class="btn btn-lg btn-primary btn-block" id="loginbutton" type="submit">Sign in</button>

      <p class="mt-3 mb-5 text-muted">Planning Tool</p>
    </form>

<script type="text/javascript">
    $(document).ready(function () {

        $("#login-form").on('submit', function (e) {
            e.preventDefault();
            login();
        });

    function login(){
        alert($("#uname").val())
          $.ajax({
                url: {% url 'auth:Login' %},
                method : "POST",
                data : {
                    "username" : $("#uname").val(),
                    "password" : $("#passwd").val(),
                    'csrfmiddlewaretoken' :  "{{ csrf_token }}"
                },
              success : function (data) {
                  alert("successful")
              },
              failure : function (data) {
                  alert("did not pass")
              }
            });
    }

    });

</script>
</body>
</html>

網址.py

from django.conf.urls import url
from django.urls import path
from . import views
from django.conf import settings

app_name = 'auth'

urlpatterns = [
    url(r'^', views.index, name='Home'),
    path('auth-login/', views.auth_login, name='Login'),
    path('auth-logout/', views.logout, name='Logout'),
]

---- Django 控制台 ----

(venv) C:\Users\Krushika.Tapedia\PycharmProjects\schedulingtool>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 26, 2019 - 11:50:45
Django version 2.2.4, using settings 'schedulingtool.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[26/Nov/2019 11:50:48] "GET / HTTP/1.1" 200 3825
[26/Nov/2019 11:50:48] "GET /static/download.png HTTP/1.1" 304 0
[26/Nov/2019 11:51:00] "POST /auth-login/ HTTP/1.1" 200 3825


我在論壇上提到了不同的答案,我也試過這個也點擊這里

但它不會進入函數並在終端上打印第一條語句。 我無法調試這個,也無法理解這里的問題。

提前致謝。

編輯:粘貼整個 HTML 文件供您嘗試以及 Django 控制台

您可能需要在文件urls.py更改它:

url(r'^', views.index, name='Home'),

path(r'^', views.index, name='Home'),

來自關於url功能的官方文檔

這個函數是django.urls.re_path()的別名。 它可能會在未來的版本中被棄用。

您的url函數匹配任何字符串,因此所有請求都會發送到您的views.py文件中的index函數。

嘗試這個:

@csrf_protect
def auth_login(request):
    print("Hello !")
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            group = user.groups.values()[0]['name'] 
            print(username)
            print(user)
            print(password)

您的意思是:“它沒有進入函數並在終端上打印第一個語句('Hello!'??)。” 哪個功能?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM