2011-09-22 27 views
15

Có cách nào đơn giản hơn để thêm người dùng hơn với mẫu sau không?Tương đương với get_or_create để thêm người dùng

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 

Trả lời

4

Tôi không nghĩ vậy. Nhưng bạn có thể proxify người dùng 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 
+1

Hiện tại, hãy xem @nu câu trả lời của everest. –

14

Trong Django 1.4, get_or_create() tồn tại cho người dùng.

from django.contrib.auth.models import User 

_user = User.objects.get_or_create(
     username=u'bob', 
     password=u'bobspassword', 
    ) 
+1

Trong ví dụ này, '_user' sẽ là một tuple' (user_object, was_just_created) '. –

+4

Thao tác này sẽ không đặt đúng mật khẩu cho người dùng. Trường 'mật khẩu' thô giữ hàm băm muối, chứ không phải mật khẩu. Bạn sẽ phải gọi 'set_password()' trên người dùng khi mới được tạo, và sau đó lưu nó (một lần nữa). Không lý tưởng. Bằng cách này, bạn có thể muốn có nó trong 'mặc định' kwarg anyway. –

+0

@DavideR. Điều này làm việc tốt trong Django 1.4. –

1

Tốt hơn là không bắt được IntegrityError vì nó có thể xảy ra vì các lý do khác. Bạn cần phải kiểm tra xem người dùng có tồn tại hay không, không bao gồm mật khẩu. Nếu người dùng đã tồn tại, hãy đặt mật khẩu.

user, created = User.objects.get_or_create(username=username, email=email) 
if not created: 
    user.set_password(password) 
Các vấn đề liên quan