Django无法识别手动输入的User ID问题求助
Django注册时User ID无法识别问题排查与修复
问题描述
使用Django开发Web应用,注册时系统无法识别手动输入的User ID,按User模型格式输入也无法完成注册,手动添加User ID作为临时修复也无效。
报错截图

相关代码
urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('<int:user_id>/', views.profile, name="profile"), #path('signup/', views.signup, name="signup"), path("signup/", views.signup, name="signup") ]
views.py
from django.shortcuts import render, get_object_or_404 from django.contrib.auth import forms from django.urls import reverse_lazy from django.http import HttpResponse, Http404, HttpResponseRedirect from django.template import loader from .models import User from .forms import SignUpForm from datetime import datetime def index(request): cool_people_list = User.objects.order_by("-username")[:5] _template = loader.get_template("front_page.html") context = { "cool_people_list" : cool_people_list, } return HttpResponse(_template.render(context, request)) def profile(request, user_id): try: user = get_object_or_404(User, pk=user_id) _template = loader.get_template("profile.html") context = { "user" : user } return HttpResponse(_template.render(context, request)) except: raise Http404("The user you are looking for doesn't exist.") def signup(request): if request.method == "POST": form = SignUpForm(request.POST) if form.is_valid(): # 获取表单中用户输入的User ID(需确保SignUpForm包含user_id字段) user_id = form.cleaned_data.get("user_id") username = form.cleaned_data.get("username") password = form.cleaned_data.get("password") # 生成符合模型字段要求的日期时间对象 join_date = datetime.today().date() last_online = datetime.now() # 用关键字参数创建User对象,避免位置参数顺序错误 new_user = User( user_id=user_id, username=username, password=password, join_date=join_date, last_online=last_online ) new_user.save() # 注册成功后重定向,防止表单重复提交 return HttpResponseRedirect(reverse_lazy('index')) else: # GET请求时初始化表单 form = SignUpForm() return render(request, "signup.html", {"form": form})
models.py
from django.db import models from django.core.validators import MinLengthValidator import datetime class User(models.Model): # 将user_id设为主键,确保系统能正确识别并维护唯一性 user_id = models.IntegerField(primary_key=True, unique=True) username = models.CharField(max_length=25, validators=[MinLengthValidator(3)]) password = models.CharField(max_length=25, validators=[MinLengthValidator(7)]) join_date = models.DateField() last_online = models.DateTimeField() def __str__(self): return self.username
关键修复点
- 模型主键配置:在
models.py中把user_id设置为primary_key=True,让Django将其作为用户表的主键,确保系统能正确识别User ID的唯一性。 - 移除硬编码User ID:原代码中手动写死
User(3, ...)是核心错误,改为从表单获取用户输入的User ID。 - 字段赋值规范:创建User对象时使用关键字参数,避免因位置参数顺序错误导致字段匹配混乱。
- 日期类型修正:将
join_date和last_online改为生成date/datetime对象,而非字符串,匹配模型字段的类型要求。 - 完善表单流程:补充GET请求的表单初始化逻辑,注册成功后添加重定向,避免重复提交问题。
内容的提问来源于stack exchange,提问作者kool
相关产品推荐
相关产品推荐

