如何在 Django 中创建用户?

我试图通过以下代码在 Django 项目中创建一个新的 User,但突出显示的行触发了一个异常。

def createUser(request):
userName = request.REQUEST.get('username', None)
userPass = request.REQUEST.get('password', None)
userMail = request.REQUEST.get('email', None)


# TODO: check if already existed


**user = User.objects.create_user(userName, userMail, userPass)**
user.save()


return render_to_response('home.html', context_instance=RequestContext(request))

有人帮忙吗?

153955 次浏览

是否确认传递的是实际值而不是 None

from django.shortcuts import render


def createUser(request):
userName = request.REQUEST.get('username', None)
userPass = request.REQUEST.get('password', None)
userMail = request.REQUEST.get('email', None)


# TODO: check if already existed
if userName and userPass and userMail:
u,created = User.objects.get_or_create(userName, userMail)
if created:
# user was created
# set the password here
else:
# user was retrieved
else:
# request was empty


return render(request,'home.html')

在 Django 中创建用户的正确方法是使用 create _ user 函数。这将处理密码的散列等。.

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
email='jlennon@beatles.com',
password='glass onion')

使用 set_password创建大容量用户

我你正在创建几个测试用户,bulk_create是快得多,但我们不能使用 create_user与它。

set_password是另一种生成散列密码的方法:

def users_iterator():
for i in range(nusers):
is_superuser = (i == 0)
user = User(
first_name='First' + str(i),
is_staff=is_superuser,
is_superuser=is_superuser,
last_name='Last' + str(i),
username='user' + str(i),
)
user.set_password('asdfqwer')
yield user


class Command(BaseCommand):
def handle(self, **options):
User.objects.bulk_create(iter(users_iterator()))

关于密码散列的特定问题: 如何使用 Bcrypt 在 Django 中加密密码

在 Django 1.9中测试。

如果您正常创建用户,您将无法登录,因为密码创建方法可能不同 您可以使用默认的注册表单

from django.contrib.auth.forms import UserCreationForm

You can extend that also

from django.contrib.auth.forms import UserCreationForm


class UserForm(UserCreationForm):
mobile = forms.CharField(max_length=15, min_length=10)
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ['username', 'password', 'first_name', 'last_name', 'email', 'mobile' ]

然后在视图中使用这个类

class UserCreate(CreateView):
form_class = UserForm
template_name = 'registration/signup.html'
success_url = reverse_lazy('list')


def form_valid(self, form):
user = form.save()

如果您只是使用 object.save()来创建用户,原始密码将在数据库中直接可见。 首先,不安全。 第二,密码的加密没有完成,导致解密器将使用数据库中的原始密码解密错误的密码,这使得登录成为不可能。 我想每次使用来自 django.contrib.auth的认证函数时,实际上都在使用它的解密器。 是的,我想每次你登录的时候你的密码都需要重新解密。