添加用户的方式是否比使用以下模式更简单?
try:
new_user = User.objects.create_user(username, email, password)
except IntegrityError:
messages.info(request, "This user already exists.")
else:
new_user.first_name = first_name
# continue with other things
答案 0 :(得分:16)
在Django 1.4中,用户存在get_or_create()。
from django.contrib.auth.models import User
_user = User.objects.get_or_create(
username=u'bob',
password=u'bobspassword',
)
答案 1 :(得分:6)
最好不要抓住IntegrityError
,因为其他原因会发生这种情况。您需要检查用户是否存在,不包括密码。如果用户已存在,请设置密码。
user, created = User.objects.get_or_create(username=username, email=email)
if not created:
user.set_password(password)
答案 2 :(得分:4)
我不这么认为。但您可以代理Django用户:
class MyUser(User):
class Meta:
proxy = True
def get_or_create(self, username, email, password, *args, **kwargs):
try:
new_user = User.objects.create_user(username, email, password)
except IntegrityError:
return User.objects.get(username=username, email=email)
else:
new_user.first_name = kwargs['first_name'] # or what you want
...etc...
return new_user
答案 3 :(得分:-1)
此方法应解决此问题,但请记住,在数据库中,密码保留为密码的哈希值,如前所述,“get_or_create”进行精确查找。所以在查找实际发生之前,我们会从kwargs“弹出”密码。 自定义UserManager上的此方法:
def get_or_create(self, defaults=None, **kwargs):
password = kwargs.pop('password', None)
obj, created = super(UserManager, self).get_or_create(defaults, **kwargs)
if created and password:
obj.set_password(password)
obj.save()
return obj, created