为什么我无法验证通过自定义 manage.py 命令创建的 Django 用户?
Why can't I authenticate a Django user created from a custom manage.py command?
这个让我完全难住了。我有一个模型扩展了 Django 中的基本用户模型,所以我正在编写一个自定义 manage.py
命令来创建超级用户。它似乎工作正常,但由于某种原因,我通过此自定义命令创建的任何用户都无法通过 Django 进行身份验证。当我检查数据库时,确实正在创建用户并且所有信息都是正确的。
这是我自定义命令的代码,位于一个名为 createadmin.py
的文件中(我省略了与问题无关的代码位):
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
class Command(BaseCommand):
help = 'Creates a Django admin user'
def handle(self, *args, **options):
username = raw_input('Admin username: ')
password = raw_input('Admin password: ')
try:
new_user = User.objects.create_user(username, password, '')
new_user.is_superuser = True
new_user.is_staff = True
new_user.save()
self.stdout.write('Admin created successfully')
except:
self.stdout.write('Sorry, there was a problem creating a new user in the database.')
现在,如果我 运行 使用 python manage.py createadmin
这个命令,一切似乎都正常,并且在数据库中创建了用户。
为了演示问题,这里是使用 createadmin
和 shell
进行测试的输出:
创建管理员
Admin username: testadmin
Admin password: admin
Admin created successfully
shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
>>> user = User.objects.get(username='testadmin')
>>> user.is_superuser
True
>>> user.is_active
True
>>> user.is_staff
True
>>> authenticate(username='testadmin', password='admin') is None
True
如您所见,用户存在,但我无法对他们进行身份验证。当我尝试从 login
视图中对服务器上的用户进行身份验证时,我得到了类似的行为。任何想法可能是什么问题?
create_user
的第二个位置参数是电子邮件,而不是密码。
您应该使用关键字参数:
new_user = User.objects.create_user(username, password=password)
这个让我完全难住了。我有一个模型扩展了 Django 中的基本用户模型,所以我正在编写一个自定义 manage.py
命令来创建超级用户。它似乎工作正常,但由于某种原因,我通过此自定义命令创建的任何用户都无法通过 Django 进行身份验证。当我检查数据库时,确实正在创建用户并且所有信息都是正确的。
这是我自定义命令的代码,位于一个名为 createadmin.py
的文件中(我省略了与问题无关的代码位):
from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import User
class Command(BaseCommand):
help = 'Creates a Django admin user'
def handle(self, *args, **options):
username = raw_input('Admin username: ')
password = raw_input('Admin password: ')
try:
new_user = User.objects.create_user(username, password, '')
new_user.is_superuser = True
new_user.is_staff = True
new_user.save()
self.stdout.write('Admin created successfully')
except:
self.stdout.write('Sorry, there was a problem creating a new user in the database.')
现在,如果我 运行 使用 python manage.py createadmin
这个命令,一切似乎都正常,并且在数据库中创建了用户。
为了演示问题,这里是使用 createadmin
和 shell
进行测试的输出:
创建管理员
Admin username: testadmin
Admin password: admin
Admin created successfully
shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
>>> user = User.objects.get(username='testadmin')
>>> user.is_superuser
True
>>> user.is_active
True
>>> user.is_staff
True
>>> authenticate(username='testadmin', password='admin') is None
True
如您所见,用户存在,但我无法对他们进行身份验证。当我尝试从 login
视图中对服务器上的用户进行身份验证时,我得到了类似的行为。任何想法可能是什么问题?
create_user
的第二个位置参数是电子邮件,而不是密码。
您应该使用关键字参数:
new_user = User.objects.create_user(username, password=password)