在我的应用中,我需要用户使用他们的电子邮件和密码登录。使用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()
只需要允许我正确注册用户,然后我就可以处理其余的
答案 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