2016-02-23 18 views
5

Có thể tạo tài khoản người dùng bằng email làm tên người dùng và không có chi tiết khác như mật khẩu bằng allauth không? Mục đích là làm cho quá trình đăng ký dễ dàng nhất có thể. Có thể bỏ qua mật khẩu khi đăng ký và được cập nhật trên email xác nhận không ?. Tôi đã thử kịch bản này trong vỏ python (./manage.py shell) và có kết quả đầu ra thành công.Đăng ký Django allauth không có mật khẩu

In [1]: from django.contrib.auth.models import User 

In [2]: User.objects.create(username='nopass') 
Out[2]: <User: nopass> 

In [3]: User.objects.all() 
Out[3]: [<User: userone>, <User: nopass>] 
In [4]: usr=User.objects.all()[1] 
In [5]: usr.set_password('pwdnotset') 
In [6]: usr.save() 
In [7]: from django.contrib.auth import authenticate 
In [8]: authenticate(username='nopass',password='pwdnotset') 
Out[8]: <User: nopass> 

Tôi đã gọi đến this link và thấy rằng không có cài đặt nào cho allauth tại thời điểm đó. Tuy nhiên, câu trả lời đã được đăng vào năm 2013. Sẽ hữu ích nếu một cách để tạo người dùng mà không cần mật khẩu khi đăng ký với một số cấu hình allauth được đưa ra. Cảm ơn trước.

+1

bạn có tìm thấy ansewer không? –

+0

Tôi nghĩ rằng bạn có thể giải quyết điều này bằng cách viết một bộ điều hợp allauth cho điều đó. Hãy để tôi duyệt qua mã repo của tôi một lần nữa. Nếu tôi thấy rằng tôi sẽ đăng nó ở đây. :) – cutteeth

Trả lời

0

Tôi nghĩ rằng creating a signup form with an overridden signup() which sets an unusable password to user và nói rằng allauth sử dụng biểu mẫu đó cho quá trình đăng ký sẽ giải quyết vấn đề này. Tạo biểu mẫu Đăng ký bằng cách ghi đè đăng ký() như một biểu mẫu được cung cấp bên dưới.

class UserCreationForm(forms.ModelForm): 
    username = forms.CharField(label=_("username")) 
    # declare other fields also 
    ... 
    def signup(self, request, user): 
     user.username = self.cleaned_data['username'] 
     # make sure you are saving all needed data for user model. 
     user.set_unusable_password() 
     user.save() 

trong settings.py, nói allauth sử dụng hình thức mà cho đăng ký

ACCOUNT_SIGNUP_FORM_CLASS = 'yourapp.forms.UserCreationForm' 

Dưới đây nhất định là một IPdb stack trace cho bối cảnh trên.

 48   import ipdb;ipdb.set_trace(); 
---> 49   user.email = self.cleaned_data['email'] 
    50   user.username = self.cleaned_data['username'] 

ipdb> user 
<User: test_user> 

ipdb> user.save() 
*** IntegrityError: NOT NULL constraint failed: user.password 

ipdb> user.set_unusable_password() 
ipdb> user.save() 
ipdb> user 
<User: test_user> 
ipdb> 
0

Tôi chưa thấy cách nào để thực hiện điều này trong allauth, ngoại trừ bằng cách tùy chỉnh mã cho dự án của bạn.

Trái với những gì câu trả lời khác nói, các mã trong allauth.account.forms làm cho SignUpForm kế thừa từ hình thức đăng ký tùy chỉnh của bạn:

# in allauth.account.forms.py 
class BaseSignupForm(_base_signup_form_class()): 

BaseSignupForm được sử dụng cho cả hai "chuẩn" đăng ký và sign- tài khoản xã hội lên. Trong "chuẩn" đăng ký, nó lớp con như SignupForm và cho biết thêm các lĩnh vực mật khẩu:

# in allauth.account.forms.py 
class SignupForm(BaseSignupForm): 
def __init__(self, *args, **kwargs): 
    super(SignupForm, self).__init__(*args, **kwargs) 
    self.fields['password1'] = PasswordField(label=_("Password")) 
    if app_settings.SIGNUP_PASSWORD_ENTER_TWICE: 
     self.fields['password2'] = PasswordField(
      label=_("Password (again)")) 

Vì vậy, tôi đã cố gắng để che giấu các lĩnh vực trong giao diện mẫu, nhưng không may mắn. Có thể sử dụng một số FormHelper ở dạng giòn.

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