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

使用Django的django.contrib.auth模块登录时出现TypeError错误:login() takes 1 positional argument but 2 were given

解决Django登录时的TypeError: login() takes 1 positional argument but 2 were given问题

这个错误的核心原因是命名冲突:你在handlelogin函数里调用的login()并不是Django auth模块提供的登录函数,而是你自己定义的用于显示登录页面的视图函数(对应urls里的path('login/',views.login,name="login")),而那个视图函数只接受request这一个参数,当你传入request和user两个参数时就触发了类型错误。

下面是具体的修复步骤:

1. 正确导入Django auth的登录函数

在你的views.py文件顶部,明确导入django.contrib.auth里的login(以及authenticate、logout):

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import redirect, render  # 确保导入必要的快捷函数

2. 避免视图函数与auth函数重名

检查你的views.py,应该有一个对应path('login/',views.login,name="login")的视图函数,它的作用是渲染登录页面。为了和auth的login函数区分,把这个视图函数重命名,比如改成login_page:

# 原来的login函数(负责渲染登录页面)
def login_page(request):
    return render(request, '你的登录模板路径.html')  # 替换成你实际的模板路径

然后更新urls.py里的对应路径:

path('login/',views.login_page,name="login"),

3. 优化登录后的跳转逻辑

把handlelogin里的redirect('')改成具体的跳转目标,比如首页redirect('home'),避免跳转到空路径:

def handlelogin(request): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(request, username=username, password=password) 
    if user is not None: 
        login(request, user) 
        return redirect('home')  # 跳转到首页
    else: 
        return redirect('login')  # 登录失败返回登录页

额外检查

你的表单action="user"是正确的,因为登录页面在/login/,提交后会指向/login/user,和urls里的path('login/user',views.handlelogin,name="loginuser")完全匹配,这部分无需修改。

修复完成后,handlelogin函数就能正确调用Django auth的登录方法,完成用户登录流程了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:22:34