本文共 5113 字,大约阅读时间需要 17 分钟。
5. 自定义过滤器和模板标签
5.1 新建templatetags模块
- app 目录下,新建templatetags 模块(不是文件夹)
- 再到 templatetags下创建py文件(名字就是过滤器的名称)
注意:templatetags这个目录名字是固定的,而里面的模块名是自定义的.
5.2 注册过滤器
- 通过
django.template.Library
它的实例的 filter 方法
filter 有两个参数:
- name 过滤器的名称,是个字符串,默认使用方法名作为过滤器的名称
- filter_func 定义的过滤器的函数
例子
现在需要把性别1变为男。0对应女
这就应该写自定义过滤器 通过{% load %} 加载自定义过滤器 在加载过滤器的html中引入函数的名称 效果如下还可以通过:
来传入参数
效果如下:
5.3 自定义模板标签
- 自定义简单标签
通过@register.simple_tag()
注册,可以设置name属性,不设置就是函数名
这里的context通过view传递的,需要在simple_tag 中,设置参数take_context=True,可以在自定义的模板标签中拿到context中的format_str
将日期的format_str传入
这让就可以将datetime的改成自己想要的类型
- 自定义包含标签(在特定html传入参数)
通过@register.inclusion_tag()
定义
student从view中导入到index.html
stu.course是模型那边的
效果如下
6. 用户注册
django的强大之处在于开发效率高,内置了权限模块之类的很多常用功能。django内置权限系统有大的自定义功能扩展,不需要重复造轮子。
- 在settings.py中设置
AUTH_USER_MODEL
指向user的app的User模型
# 自定义用户模型 # 这里的user是app,User是模型 不是固定的 AUTH_USER_MODEL = 'user.User'
6.1 UserManager
- UserManager这是django用户管理者
通过python manage createsupermanage
来创建超级用户,但是有的时候还需要超级用户的其他字段,如email
user app下的model
from django.contrib.auth.models import AbstractUser,UserManager as _UserManager # Create your models here. class UserManager(_UserManager): ''' 自定义usermanage 修改时使用python manage createsupermanage命令时,我可以不提供email字段 ''' def create_superuser(self,username,password,email= None,**extra_fields): return super().create_superuser(username=username,password=password,email=email,**extra_fields)
这里将内置的UserManager命名为_UserManager,来改写UserManager
这是UserManager的源码
通过上面改写UserManager的create_superuser创建超级用户可以不提供email字段
6.2 AbstractUser
- AbstractUser这是django特定的抽象用户
导入方式 : from django.contrib.auth.models import AbstractUser
创建用户的model,继承了AbstractUser
class User(AbstractUser): """ add mobile, email_active fields to Django user model. """ mobile = models.CharField('手机号', max_length=11, unique=True, help_text='手机号', error_messages={ 'unique': '此手机号码已注册'}) email_active = models.BooleanField('邮箱状态', default=False) class Meta: db_table = 'tb_user' # 指定数据库表名 verbose_name = '用户' # 在admin站点中显示名称 verbose_name_plural = verbose_name # 显示复数 def __str__(self): return self.username # A list of the field names that will be prompted for # when create a user via createsuperuser management command. # 必需字段 REQUIRED_FIELDS = ['mobile'] # specify manager objects = UserManager()
标准的用户注册流程
- 注册页面
- 图片验证码
- 用户名检测是否注册
- 手机号检测是否注册
- 短信验证码
- 注册保存用户数据
因为图片验证码,短信验证码考虑到后续可能会在其他业务中用到,因此将验证码功能独立出来,创建一个新appverification。在项目中一般叫verification 验证的意思
用户校验典型的POST,需创建forms.py
from django_redis import get_redis_connection class RegisterForm(forms.Form): """ 用户注册表单 """ username = forms.CharField(label='用户名', max_length=20, min_length=5, error_messages={ 'max_length': '用户名长度要小于20', 'min_length': '用户名长度要大于5', 'required': '用户名不能为空', }) password = forms.CharField(label='密码', max_length=20, min_length=6, error_messages={ 'max_length': '密码长度要小于20', 'min_length': '密码长度要大于5', 'required': '密码不能为空', }) password_repeat = forms.CharField(label='确认密码', max_length=20, min_length=6, error_messages={ 'max_length': '密码长度要小于20', 'min_length': '密码长度要大于5', 'required': '密码不能为空', }) mobile = forms.CharField(label='手机号码', max_length=11, min_length=11, validators=[mobile_validator, ], error_messages={ 'max_length': '手机号码长度不正确', 'min_length': '手机号码长度不正确', 'required': '手机号码不能为空', }) sms_code = forms.CharField(label='短信验证码', max_length=constants.SMS_CODE_LENGTH, min_length=constants.SMS_CODE_LENGTH, error_messages={ 'max_length': '短信验证码长度不正确', 'min_length': '短信验证码长度不正确', 'required': '短信验证码不能为空', }) def clean_username(self): """ 校验用户名 :return: """ username = self.cleaned_data.get('username') if User.objects.filter(username=username).exists(): raise forms.ValidationError('用户名已存在!') return username def clean_mobile(self): """ 校验手机号码 :return: """ mobile = self.cleaned_data.get('mobile') if User.objects.filter(mobile=mobile).exists(): raise forms.ValidationError('手机号码已注册!') return mobile def clean(self): """ 联合校验 :return: """ clean_data = super().clean() # 校验密码是否一致 password = clean_data.get('password') password_repeat = clean_data.get('password_repeat') if password != password_repeat: raise forms.ValidationError('两次密码不一致!') # 校验短信验证码 sms_code = clean_data.get('sms_code') moblie = clean_data.get('mobile') redis_conn = get_redis_connection(alias='verify_code') real_code = redis_conn.get('sms_text_{}'.format(moblie)) if (not real_code) or (real_code.decode('utf-8') != sms_code): raise forms.ValidationError('短信验证码错误!')
上面的代码只做参考
有点长,先在此处断开
转载地址:https://maoli.blog.csdn.net/article/details/100582943 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!