Django电影项目添加登录功能时触发AttributeError错误求助
Django电影项目添加登录功能时触发AttributeError错误求助
嘿,我一眼就瞅出问题所在啦!你碰到的AttributeError: 'str' object has no attribute 'POST'错误,根源完全在视图函数的代码里。
错误原因
在signin函数中,你错误地写了request.method.POST来获取表单数据:
u=request.method.POST['u'] p=request.method.POST['p']
这里的request.method是个字符串(当请求是POST类型时,它的值就是'POST'),字符串哪来的POST属性呀?这就是触发错误的直接原因。正确的姿势是直接用request.POST对象来读取表单参数。
修正后的views.py代码
from django.contrib.auth.models import User from django.contrib.auth import authenticate,login,logout from django.contrib import messages from django.shortcuts import render, redirect # 建议导入redirect,跳转更规范 def signin(request): if request.method == 'POST': # 核心修正:直接使用request.POST获取表单数据 u = request.POST['u'] p = request.POST['p'] user = authenticate(username=u, password=p) if user: login(request, user) # 这里推荐用redirect跳转,而非直接调用home(request) return redirect('movie:home') # 假设你的首页路由name是home else: messages.error(request, 'Invalid Credentials') return render(request, 'signin.html') # 处理GET请求,返回登录页面 return render(request, 'signin.html')
额外优化小建议
- 密码输入框当前用的是
type="text",改成type="password"更合理,用户输入的密码会被隐藏,提升安全性:<input class="form-control" type="password" name="p" placeholder="Enter your password"> - 可以用
request.POST.get('u')替代request.POST['u'],这样如果表单里没有对应字段,会返回None而不是抛出KeyError,让代码更健壮。
你提供的原始代码参考
模板文件 signin.html
{% extends 'base.html' %} {% load static %} {% block content %} <div class="container"> <h1>Sign-in</h1> <form method="POST" enctype="multipart/form-data"> {% csrf_token %} <div class="mb-3"> <label class="form-label"></label> <input class="form-control" type="text" name="u" placeholder="Enter your username"> <div class="form-text"></div> </div> <div class="mb-3"> <label class="form-label"></label> <input class="form-control" type="text" name="p" placeholder="Enter your password"> <div class="form-text"></div> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> {% if messages %} {% for i in messages%} <ul class='messages'> <li>{{i}}</li> </ul> {% endfor %} {% endif %} </div> {% endblock %}
路由配置 urls.py
from django.urls import path from movie import views app_name='movie' urlpatterns = [ path('signin',views.signin,name='signin'), ]
备注:内容来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

