Django allauth注册没有密码

cut*_*eth 7 python passwords django user-accounts django-allauth

是否可以使用电子邮件作为用户名创建用户帐户,而没有其他详细信息,例如使用allauth的密码?目的是使注册过程尽可能简单.注册时可以跳过密码并在电子邮件确认时更新吗?我在python shell(./manage.py shell)中尝试了这个场景并且有成功的输出.

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>
Run Code Online (Sandbox Code Playgroud)

我已经提到过这个链接,发现当时没有这样的设置.然而,回复是在2013年发布的.如果设计了一种在注册时使用某些allauth配置创建没有密码的用户的方法,将会很有帮助.提前致谢.

cut*_*eth 1

我认为creating a signup form with an overridden signup() which sets an unusable password to user并说 allauth 使用该表格进行注册过程将解决这个问题。通过重写signup() 创建一个注册表单,如下所示。

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()
Run Code Online (Sandbox Code Playgroud)

在 settings.py 中,告诉 allauth 使用该表单进行注册

ACCOUNT_SIGNUP_FORM_CLASS = 'yourapp.forms.UserCreationForm'
Run Code Online (Sandbox Code Playgroud)

下面给出的是上述上下文的 ipdb 堆栈跟踪。

     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> 
Run Code Online (Sandbox Code Playgroud)