Django项目知识点(二)
5. 自定義過濾器和模板標簽
5.1 新建templatetags模塊
- app 目錄下,新建templatetags 模塊(不是文件夾)
- 再到 templatetags下創建py文件(名字就是過濾器的名稱)
注意:templatetags這個目錄名字是固定的,而里面的模塊名是自定義的.
5.2 注冊過濾器
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_connectionclass?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('短信驗證碼錯誤!')
上面的代碼只做參考
有點長,先在此處斷開
總結
以上是生活随笔為你收集整理的Django项目知识点(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 挣钱多适合女生的职业 2019年值得考虑
- 下一篇: 2018青岛社保缴费基数