You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目注册后无法跳转至登录页问题求助

Django注册表单提交后无法跳转至登录页面的问题

我这是第一个Django项目,原本期望用户填写注册表单并点击注册按钮后跳转至登录页面,但实际提交后页面仅刷新,仍停留在signup.html页面。不清楚问题出在哪,求帮忙排查。(注:HTML文件存放在templates文件夹,.js和.css文件存放在static文件夹,两者均独立且与app文件夹同级)

完整代码

signup.html

{% load static%}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" >
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>FitFlow - Sign Up</title>
    <link rel="stylesheet" type="text/css" href="{% static 'styles.css' %}">
    <!--flatpickr-->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
</head>
<body class="page-background">
    <div class = "container">
    <form class="form" action="{% url 'signup' %}" method="POST">
        {% csrf_token %}
      <h1 class="form_title">Create Account</h1>
      <div class="form_input_group">
        <input type="text" id= "name" class = "form_input" autofocus placeholder="Name" required>
      </div>
      <div class="form_input_group">
              <input type="text" id= "username" class = "form_input" placeholder="Username" required>
            </div>
      <div class="form_input_group">
        <input type="email" id="email" class = "form_input" autofocus placeholder="Email" required>
      </div>
      <div class="form_input_group">
        <input type="password" id="password1" class = "form_input" autofocus placeholder="Password" required>
        <div class="form_input-error-message"></div>
      </div>
      <div class="form_input_group">
        <input type="password" id ="password2" class = "form_input" autofocus placeholder="Confirm Password" required>
        <div class="form_input-error-message"></div>
      </div>
      <div class="form_input_group">
        <div class="custom_select">
          <select id="ageRange" name="ageRange" required>
            <option value="">Age Range</option>
            <option value="1">under 18</option>
            <option value="2">18-29</option>
            <option value="3">30-39</option>
            <option value="4">40-49</option>
            <option value="5">50+</option>
          </select>
        </div>
      </div>
      <div class="form_input_group">
        {% if error %}
        <div class="error-message">
          The passwords do not match.
        </div>
      {% endif %}
      </div>
      <div class="form_input_group">
        <input type="text" class="custom-lastPeriod" id="lastPeriod" name="lastPeriod" autofocus placeholder="First Day of Last Period" required>
      </div>
      <div class="form_input_group">
        <div class="custom_select">
          <select id="exercisePurpose" name="exercisePurpose" required>
            <option value="">Exercise Purpose</option>
            <option value="loseWeight">Lose Weight</option>
            <option value="buildMuscle">Build Muscle</option>
            <option value="improveEndurance">Improve Endurance</option>
            <option value="stayActive">Stay Active</option>
          </select>
        </div>
      </div>
      <div class="form_button_container">
        <button class ="form_button" type="submit">Sign Up</button>
      </div>
      <p class="form_text">
        <a href="{% url 'login' %}">Already have an account? Log in</a>
      </p>

    </form>
  </div>

  <!--Bootsrap JS
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrate ></script>-->

  <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
  <script>
    flatpickr("#lastPeriod", {
      placeholder: "Select Last Period"
    });
  </script>
  <script src="{% static 'script2.js' %}"></script>
</body>
</html>

views.py

def login(request):
    if request.method == "POST":
        email = request.POST["email"]
        password = request.POST["password1"]
        user = authenticate(email=email, password=password)
        if user is not None:
            login(request, user)
            return redirect('mainpg')
        else:
            return render(request, 'login.html', {"error": "Invalid username or password."})
    
    return render(request, 'login.html')

def signup(request):
    if request.method == "POST":
        try:
            username = request.POST['username']
        except MultiValueDictKeyError as e:
            messages.error(request, 'Please enter a username.')
            return redirect('signup')

        name = request.POST['name']
        email = request.POST['email']
        age_range = request.POST['ageRange']
        last_period = datetime.strptime(request.POST['lastPeriod'], "%Y-%m-%d")
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        exercise_purpose = request.POST['exercisePurpose']
        print("Sign up form submitted")
        if password1!= password2:
            return render(request, 'signup.html', {"error": "Passwords do not match."})
        
        user = User.objects.create_user(username=username, name=name, email=email, password=password1)
        user.save()
        
        print("Sign up form submitted")

        return redirect('/login')
    
    return render(request, 'signup.html')

urls.py

from django.contrib import admin
from django.urls import path, include
from . import views
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns = [
    path('', views.app, name="app"),
    path('login/', views.login, name="login"),
    path('signup/', views.signup, name="signup"),
    path('mainpg/', views.mainpg, name="mainpg"),
    path('forgotp', views.forgotp, name="forgotp"),
]

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, '..','collected_static')

问题排查与修复方案

1. 表单字段缺失name属性

HTML表单中,只有带有name属性的输入框才会被提交到后端。你的signup.html里,name、username、email、password1、password2这些输入框只有id,没有name,导致后端request.POST无法获取到这些值,触发异常后页面刷新。

修复:给这些输入框添加对应name属性,示例如下:

<input type="text" id="name" name="name" class="form_input" autofocus placeholder="Name" required>
<input type="text" id="username" name="username" class="form_input" placeholder="Username" required>
<input type="email" id="email" name="email" class="form_input" autofocus placeholder="Email" required>
<input type="password" id="password1" name="password1" class="form_input" autofocus placeholder="Password" required>
<input type="password" id="password2" name="password2" class="form_input" autofocus placeholder="Confirm Password" required>

2. 缺少datetime模块导入

views.py中使用了datetime.strptime,但没有导入datetime模块,会引发NameError。

修复:在views.py顶部添加导入语句:

import datetime

3. User模型字段不匹配

默认Django User模型没有name字段,你在create_user时传入name=name会报错。如果是自定义User模型,需要确保在settings.py中配置了AUTH_USER_MODEL;如果用默认模型,可改用first_name存储名称:

user = User.objects.create_user(username=username, email=email, password=password1)
user.first_name = name
user.save()

4. 硬编码跳转路径优化

把return redirect('/login')改成return redirect('login'),使用urls中定义的名称,避免路径变更导致跳转失效。

完成以上修改后,注册表单提交后应该能正常跳转至登录页面。

内容的提问来源于stack exchange,提问作者Daniella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:57:01