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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:08:05