Django all-auth电子邮件必填

时间:2014-05-30 13:54:53

标签: django django-allauth

在我的应用中,我需要用户使用他们的电子邮件和密码登录。使用allauth它创建一个注册表单,其中电子邮件字段是可选的,并且有一个用户名字段。

我希望我的注册有三个字段:

  • 电子邮件
  • 密码
  • 再次
  • 密码

我尝试过创建一个自定义表单,但由于某些原因它无法运行。我不知道如何从表单中删除用户名。

class SignupForm(forms.Form):        
    email = forms.EmailField(label='Email', required=True)        
    class Meta:
        model = get_user_model()       
    def save(self, user):
        user.email = self.cleaned_data['email']
        user.save()

只需要允许我正确注册用户,然后我就可以处理其余的

4 个答案:

答案 0 :(得分:10)

这是一个古老的问题,但如果将来有人帮助某人,这就是django-allauth在其文档中所说的:

  

ACCOUNT_AUTHENTICATION_METHOD(=“username”|“email”|“username_email”)   指定要使用的登录方法 - 用户是否通过输入用户名,电子邮件地址或两者之一来登录。

  

ACCOUNT_USERNAME_REQUIRED(= True)   注册时,用户需要输入用户名。请注意,即使ACCOUNT_AUTHENTICATION_METHOD设置为电子邮件,也会要求用户这样做。如果您不希望提示用户输入用户名,请设置为False。

所以在你的settings.py中你可以这样做:

ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'

有关django-allauth配置的更多信息,请阅读: django-allauth documentation - configuration

答案 1 :(得分:4)

解决方案很简单,这只是一个配置问题。我将这些添加到设置文件中:

ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True
ACCOUNT_SIGNUP_FORM_CLASS = 'accounts.forms.SignupForm'

答案 2 :(得分:1)

首先,您应该使用ModelForm使用表单数据保存和对象实例,或者您可以使用内置的UserCreationForm更多detils here

class RegisterForm(UserCreationForm):

    class Meta:
        model = UserProfile
        fields = ("email", "password1", "password2")

在models.py文件中,您应将email字段指定为username field。检查this

最后登录部分。您应该编写自己的自定义登录视图,以便用户使用他们的电子邮件登录。在您的网址中添加以下内容:

(r'^email-login/', 'app.views.email_login', name="login"),

views.py

from django.contrib.auth import authenticate, login

def email_login(request):
    email = request.POST['email']
    password = request.POST['password']
    try:
        get_user = UserProfile.objects.get(email=email)
    except:
        get_user = None

    user = authenticate(username=get_user, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)

我没有测试代码,但是一旦我以这种方式解决了我的问题。所以这些可能会给你一些如何做到这一点的想法。我相信你可以在page

中找到你需要的大部分答案

评论是否需要任何额外信息。

答案 3 :(得分:1)

我同意Callum接受的答案,除了拼写错误(ACCOUNT_USERNAME_REQUIRED应 False )。但是,我没有足够的观点以评论的形式留下我的贡献。以下适用于Django 1.7。

在settings.py中:

# Sign IN settings
ACCOUNT_AUTHENTICATION_METHOD = 'email'

# Sign UP settings
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False