Django allauth注册时不需要密码

8

是否可以使用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>

我参考了这个链接,发现当时allauth没有此设置。不过,这个回复是在2013年发布的。如果能够设计出一种可以在注册时使用一些allauth配置而无需密码创建用户的方法将会很有帮助。提前感谢。

1
你找到答案了吗? - Omar Gonzales
我认为你可以通过编写一个allauth适配器来解决这个问题。让我再浏览一下我的代码库。如果我找到了,我会在这里发布的。 :) - cutteeth
3个回答

1
我认为通过创建一个带有重写的signup()函数的注册表单,并将其设置为无法使用的密码以供用户使用,然后告诉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()

在settings.py中,告诉allauth使用该表单进行注册。
ACCOUNT_SIGNUP_FORM_CLASS = 'yourapp.forms.UserCreationForm'

以下是与上下文相关的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> 

是的,那是几年前的事了。我覆盖了一些视图和表单(注册视图)来实现它。也许新版本的allauth有这个功能。我不确定。上面发布的代码被用来解决这个问题。 - cutteeth

1
目前,除非自定义项目的代码,否则我还没有看到在allauth中执行此操作的方法。
与其他答案不同,allauth.account.forms中的代码使SignUpForm从您的自定义注册表单继承。
# in allauth.account.forms.py
class BaseSignupForm(_base_signup_form_class()):

BaseSignupForm 既用于“标准”注册,也用于社交账号注册。 在“标准”注册中,它会作为 SignupForm 的子类,并添加密码字段:

# 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)"))

所以,我尝试在视图模板中隐藏字段,但没有成功。也许使用crispyforms中的FormHelper是正确的方法。

1

一种选择是创建一个自定义注册视图,并覆盖注册模板以发布到您的自定义视图。在该视图中,您可以使用自己的SignupForm,该表单不需要密码。

表格:

class CustomUserCreationForm(forms.ModelForm):

    class Meta:
        model = CustomUser
        fields = ('email',)

    def save(self, commit=True):
        instance = super().save(commit=False)
        instance.set_unusable_password()
        if commit:
            instance.save()
        return instance

查看:

class MySignupView(SignupView):
    form_class = CustomUserCreationForm

网址:

path('accounts/signup/custom/', MySignupView.as_view(), name="account_signup_custom"),

signup.html:

<form method="post" action="{% url 'account_signup_custom' %}">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接