2014-12-07 19 views
7

Tôi có biểu mẫu đăng ký chỉ yêu cầu email và mật khẩu. Khi người dùng đăng ký, django-allauth sẽ tạo tên người dùng cho người dùng đó bằng cách chia phần hậu tố "@email" thành địa chỉ email của người dùng.django-allauth đặt tên người dùng giống như email

Vì vậy, ví dụ, nếu một người dùng đăng lên với "[email protected]" Tên truy nhập của mình sẽ là "một số người dùng" và nếu một người dùng đăng ký với "một số người dùng @ gmail.com "thì tên người dùng của anh ấy sẽ là" some-userr "

Nhưng điều tôi muốn là tên người dùng và email của người dùng có cùng giá trị.

Vậy làm cách nào tôi có thể định cấu hình django-allauth để đặt tên người dùng làm email của người dùng mà không xóa các hậu tố của họ?

Và nếu có thể, làm cách nào tôi có thể làm điều đó mà không cần tạo người dùng tùy chỉnh.

Trong settings.py của tôi:

######################### 
# AllAuth Configuration # 
######################### 
ACCOUNT_AUTHENTICATION_METHOD = 'email' 
ACCOUNT_EMAIL_REQUIRED = True 
ACCOUNT_UNIQUE_EMAIL = True 
ACCOUNT_USERNAME_REQUIRED = False 
ACCOUNT_EMAIL_VERIFICATION = 'mandatory' 
ACCOUNT_PASSWORD_MIN_LENGTH = 8 
+0

Tại sao bạn cần tên người dùng giống với email. Bạn có thể cho phép người dùng của mình đăng ký bằng địa chỉ email. –

Trả lời

6

tôi làm chính xác những gì bạn muốn làm gì với một tín hiệu vào User pre_save.

thiết lập của bạn trông ok, vì vậy nếu bạn thêm đoạn mã sau vào nơi nào đó như ví dụ core.models.py nó sẽ làm việc như bạn cần:

@receiver(pre_save, sender=User) 
def update_username_from_email(sender, instance, **kwargs): 
    user_email = instance.email 
    username = user_email[:30] 
    n = 1 
    while User.objects.exclude(pk=instance.pk).filter(username=username).exists(): 
     n += 1 
     username = user_email[:(29 - len(str(n)))] + '-' + str(n) 
    instance.username = username 

Lý do tôi làm điều đó với một tín hiệu là tôi muốn rằng mỗi thời gian Người dùng được lưu, tên người dùng được cập nhật. Bạn có thể kiểm tra xem e-mail có thay đổi cập nhật tên người dùng chỉ trong trường hợp đó hay không.

Sau đó, tôi hạn chế tên người dùng đến 30 ký tự đầu tiên của email (mặc định tối đa chiều dài của tên người dùng là 30 ký tự):

username = user_email[:30] 

Bạn cũng có thể thay đổi chiều dài tối đa của tên người dùng, nhưng trong trường hợp của tôi, tôi ưa thích để sử dụng chiều dài mặc định.

Vì tôi thực hiện điều này, có thể xảy ra rằng có tên người dùng lặp lại. Để tránh tên người dùng lặp đi lặp lại, trong trường hợp đó kết quả Tên truy nhập sau khi giới hạn nó đến 30 ký tự đã tồn tại, tôi đặt -2, -3 ... ở cuối để làm cho tên người dùng duy nhất:

n = 1 
while User.objects.exclude(pk=instance.pk).filter(username=username).exists(): 
    n += 1 
    username = user_email[:(29 - len(str(n)))] + '-' + str(n) 
instance.username = username 

tôi hy vọng giải pháp này giúp bạn!

+1

Cảm ơn bạn! Câu trả lời chính xác! Đây chính là điều tôi muốn. Xin lỗi tôi không thể upvote bạn. Tôi chưa có đủ danh tiếng. Khi tôi có tôi sẽ bỏ phiếu. – GregC

+0

Rất vui khi biết rằng điều đó đã giúp ích! :) – ferrangb

Các vấn đề liên quan