Django报login() takes 1 positional argument but 2 were given错
报错原因
核心是命名空间冲突:
你自定义的视图函数被命名为login,这个函数只接收1个request位置参数;而你在函数内部想要调用Django内置的登录方法django.contrib.auth.login(),这个方法需要传入request和认证后的用户对象两个参数。
Python解析代码时会优先读取当前作用域下的定义,也就是你自己写的login视图,根本没有调用到Django内置的登录方法,所以传入两个参数时就会触发参数数量不匹配的报错,从报错回溯里也能看到,出错点就是你视图里写login(request, users)的那行。
修复步骤
- 导入Django内置登录方法时设置别名,避免名称冲突,在视图文件顶部添加导入语句:
from django.contrib.auth import login as auth_login
- 把视图中原来的登录调用语句替换为别名调用,同时建议把变量名
users改成user(认证后返回的是单个用户对象,不是用户列表,命名更规范):
- 把视图中原来的登录调用语句替换为别名调用,同时建议把变量名
# 原代码 login(request, users) 替换为 auth_login(request, user)
- (强烈建议)把你当前处理注册逻辑的视图函数名从
login改成更贴合功能的名字,比如signup、register_view,从代码逻辑看这个视图是处理用户注册表单的,命名为login本身就容易产生歧义,后续配置路由、维护代码时也容易和Django内置的登录视图、方法重名踩坑。如果修改了视图函数名,记得同步更新urls.py里路由绑定的视图引用。
- (强烈建议)把你当前处理注册逻辑的视图函数名从
修正后的参考代码
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login as auth_login # 导入你的表单、模型代码省略 def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): user = form.save() user.refresh_from_db() user.first_name = form.cleaned_data.get('first_name') user.last_name = form.cleaned_data.get('last_name') user.contact_number = form.cleaned_data.get('contact_number') user.email = form.cleaned_data.get('email') user.save() # 直接用create方法创建Customer对象不需要先实例化再save,写法更简洁 Customer.objects.create( user=user, first_name=user.first_name, last_name=user.last_name, contact_number=user.contact_number, email=user.email ) raw_password = form.cleaned_data.get('password1') auth_user = authenticate(username=user.username, password=raw_password) auth_login(request, auth_user) return redirect('Homepage') else: form = SignUpForm() return render(request, 'mysite/login.html', {'form': form})
内容的提问来源于stack exchange,提问作者Yuno
相关产品推荐
相关产品推荐

