日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django项目知识点(二)

發(fā)布時間:2024/10/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django项目知识点(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

5. 自定義過濾器和模板標簽

5.1 新建templatetags模塊

  • app 目錄下,新建templatetags 模塊(不是文件夾)
  • 再到 templatetags下創(chuàng)建py文件(名字就是過濾器的名稱)

注意:templatetags這個目錄名字是固定的,而里面的模塊名是自定義的.

5.2 注冊過濾器

  • 通過django.template.Library 它的實例的 filter 方法
  • filter 有兩個參數(shù):

    • name 過濾器的名稱,是個字符串,默認使用方法名作為過濾器的名稱
    • filter_func 定義的過濾器的函數(shù)

    例子

    現(xiàn)在需要把性別1變?yōu)槟小?對應(yīng)女

    在這里插入圖片描述
    這就應(yīng)該寫自定義過濾器

    在這里插入圖片描述
    通過{% load %} 加載自定義過濾器

    在這里插入圖片描述
    在加載過濾器的html中引入函數(shù)的名稱
    在這里插入圖片描述
    效果如下
    在這里插入圖片描述

    還可以通過: 來傳入?yún)?shù)

    在這里插入圖片描述

    效果如下:

    在這里插入圖片描述

    5.3 自定義模板標簽

    • 自定義簡單標簽

    通過@register.simple_tag()注冊,可以設(shè)置name屬性,不設(shè)置就是函數(shù)名

    這里的context通過view傳遞的,需要在simple_tag 中,設(shè)置參數(shù)take_context=True,可以在自定義的模板標簽中拿到context中的format_str

    在這里插入圖片描述

    將日期的format_str傳入

    在這里插入圖片描述

    這讓就可以將datetime的改成自己想要的類型

    在這里插入圖片描述
    • 自定義包含標簽(在特定html傳入?yún)?shù))

    通過@register.inclusion_tag()定義

    在這里插入圖片描述 在這里插入圖片描述

    student從view中導入到index.html

    加粗樣式

    stu.course是模型那邊的

    在這里插入圖片描述

    效果如下

    在這里插入圖片描述

    6. 用戶注冊

    官方文檔

    django的強大之處在于開發(fā)效率高,內(nèi)置了權(quán)限模塊之類的很多常用功能。django內(nèi)置權(quán)限系統(tǒng)有大的自定義功能擴展,不需要重復造輪子。

    • 在settings.py中設(shè)置AUTH_USER_MODEL指向user的app的User模型
    #?自定義用戶模型
    #?這里的user是app,User是模型?不是固定的
    AUTH_USER_MODEL?=?'user.User'

    6.1 UserManager

    • UserManager這是django用戶管理者

    通過python manage createsupermanage來創(chuàng)建超級用戶,但是有的時候還需要超級用戶的其他字段,如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)

    這里將內(nèi)置的UserManager命名為_UserManager,來改寫UserManager

    這是UserManager的源碼

    通過上面改寫UserManager的create_superuser創(chuàng)建超級用戶可以不提供email字段

    6.2 AbstractUser

    • AbstractUser這是django特定的抽象用戶

    導入方式 : from django.contrib.auth.models import AbstractUser

    創(chuàng)建用戶的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('郵箱狀態(tài)',?default=False)
    ????class?Meta:
    ????????db_table?=?'tb_user'????#?指定數(shù)據(jù)庫表名
    ????????verbose_name?=?'用戶'?????#?在admin站點中顯示名稱
    ????????verbose_name_plural?=?verbose_name??#?顯示復數(shù)
    ????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()

    標準的用戶注冊流程

    • 注冊頁面
    • 圖片驗證碼
    • 用戶名檢測是否注冊
    • 手機號檢測是否注冊
    • 短信驗證碼
    • 注冊保存用戶數(shù)據(jù)

    因為圖片驗證碼,短信驗證碼考慮到后續(xù)可能會在其他業(yè)務(wù)中用到,因此將驗證碼功能獨立出來,創(chuàng)建一個新appverification。在項目中一般叫verification 驗證的意思

    用戶校驗典型的POST,需創(chuàng)建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):
    ????????"""
    ????????聯(lián)合校驗
    ????????: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('短信驗證碼錯誤!')

    上面的代碼只做參考

    有點長,先在此處斷開

    總結(jié)

    以上是生活随笔為你收集整理的Django项目知识点(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。