0%

Django相关功能实现

使用手机或邮箱登录

django.contrib.auth 内置 authenticate 函数,提供用户名和密码即可验证,实现的思路为重载 authenticate 函数

settings 中添加设置:

1
2
3
4
# settings.py
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)

在 views 中编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# users/views.py(users 为 app)
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from .models import UserProfile


class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
# username, mobile, use_email 对应模型 UserProfile 中字段
user = UserProfile.objects.get(Q(username=username) | Q(mobile=username) | Q(use_email=username))
if user.check_password(password):
return user
else:
return None
except Exception as e:
return None

在模型 UserProfile 中查找 usernamemobileuse_email 与用户提交表单中字段 username 相同的对象,存在即反馈 user 对象,否则返回 None

之后再配合视图类或者函数实现登录功能即可

form 检测手机或邮箱是否注册

具体可以参见文档:Cleaning a specific field attribute

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# users/forms.py
# -*- coding:utf-8 -*-
from django import forms
from .models import UserProfile
from django.db.models import Q


__auth__ = 'Str3am'
__date__ = '2018/8/24 13:46'


class LoginForm(forms.Form):
username = forms.CharField(
required=True,
error_messages={"required": u"登录名不能为空", "invalid": u"请输入正确的用户名"}
)
password = forms.CharField(
required=True,
min_length=6,
error_messages={"required": u"密码不能为空", "invalid": u"请输入正确的密码", "min_length": u"密码最少6位"}
)

def clean_username(self):
username = self.cleaned_data['username']
is_exist = UserProfile.objects.filter(Q(mobile=username) | Q(mobile=username)).exists()
if not is_exist:
raise forms.ValidationError(u"手机或邮箱还没有注册")

form验证的运行顺序是init,clean,validte,save,更多参照这篇文章:django 表单验证

clean_username 表示检验 username 字段,templates 中显示错误仍然使用