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
相关产品推荐
相关产品推荐

