<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Django&Vue實戰(zhàn)

      一、虛擬環(huán)境

      1.1 安裝虛擬環(huán)境

      # 創(chuàng)建虛擬環(huán)境文件夾
      d:\>mkdir virtualenv
      d:\>cd virtualenv
      d:\virtualenv>pip install virtualenv
      
      # 虛擬環(huán)境-p指向python解釋器,創(chuàng)建文件夾env-py3.6
      d:\virtualenv>virtualenv -p D:\學(xué)習(xí)\編程\Python\python\python.exe env-py3.6
      
      • 激活虛擬環(huán)境
      # 進(jìn)入Scripts目錄激活虛擬環(huán)境
      d:\virtualenv>cd env-py3.6\Scripts
      d:\virtualenv\env-py3.6\Scripts>activate
      
      • 退出虛擬環(huán)境
      (env-py3.6) d:\virtualenv\env-py3.6\Scripts>deactivate.bat
      

      1.2 安裝Django

      # 虛擬環(huán)境下安裝Django
      (env-py3.6) d:\virtualenv\env-py3.6\Scripts>pip install django
      # 創(chuàng)建Django項目
      (env-py3.6) d:\virtualenv\env-py3.6\Scripts>django-admin startproject myshop
      

      二、路由

      2.1 路由基本配置

      from django.contrib import admin
      from django.urls import path
      from . imporot views
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('index/', views.index, name='index'),
          # path(路由, 視圖函數(shù), 別名)
      ]
      

      2.2 帶 URL參數(shù)的路由

      urlpatterns = [
          path('app2/show/<int:id>/', views.show),
          # <參數(shù)數(shù)據(jù)類型: 參數(shù)名稱>
      ]
      
      參數(shù)數(shù)據(jù)類型 說明
      str 任意非空字符,不包含“/”,默認(rèn)類型
      int 匹配0和正整數(shù)
      slug 匹配任何ASCII字符、連接符和下劃線
      uuid 匹配一個UUID格式的字符串,該對象必須包括"-",所有字母必須小寫。

      2.3 re_path()方法正則匹配復(fù)雜路由

      正則表達(dá)式 說明
      . 匹配任意單個字符
      \d 匹配任意一個數(shù)字
      \w 匹配字母、數(shù)字、正劃線
      * 匹配0個或多個字符
      [a-z] 匹配a~z中任意一個小寫字符
      匹配1~5個字符
      urlpatterns = [
          re_path(r'app/page/(?P<page>\d+)&key=(?P<key>\w+)', views.article_page,name='article_page'),
          # page:匹配數(shù)字
          # key:匹配字母、數(shù)字、正劃線
      ]
      

      2.4 反向解析路由

      urlpatterns = [
          path('app/url_reverse', views.url_erverse, name='app_url_reverse'),
      ]
      
      # 視圖函數(shù)使用反向解析
      from django.urls import reverse
      def url_reverse(request):
          return render(reverse('app_url_reverse'))
      
      # 在模板使用反向解析
      <div>
        {% url 'app_url_reverse' %}
      </div>
      

      2.5 視圖函數(shù)

      2.5.1 HttpRequest對象

      屬性/方法 含義
      path 字符串,表示請求頁面的路徑,不包含域名
      method 字符串,表示頁面的請求方法,常用值包括“GET”和“POST”。必須使用大寫方式
      encoding 字符串,表示提交的數(shù)據(jù)的編碼方式。一般默認(rèn)為UTF-8編碼方式
      GET 字典類型,包含GET請求方法中的有所參數(shù)
      POST 字典類型,包含POST請求方法中的有所參數(shù)
      FILES 字典類型,包含上傳文件的信息
      COOKIES 字典類型,包含所有的Cookies對象
      session 字典類型,表示當(dāng)前的會話
      META 字典類型,包含所有的HTTP頭部信息,如HTTP_USER_AGENT(客戶端Agent信息)、REMOTE_ADDR(客戶端的IP地址)等

      2.5.2 HttpResponse對象

      屬性 含義
      content 返回的內(nèi)容
      status_code 返回的HTTP響應(yīng)狀態(tài)碼
      content-type 返回的數(shù)據(jù)的MIME類型,默認(rèn)為text/html
      • 常用狀態(tài)碼status_code
      狀態(tài)碼 含義
      200 狀態(tài)成功
      301 永久重定向,Location屬性的值為當(dāng)前URL
      302 臨時重定向,Location屬性的值為新的URL
      404 URL未發(fā)現(xiàn),不存在
      500 內(nèi)部服務(wù)器錯誤
      502 網(wǎng)關(guān)錯誤
      503 服務(wù)不可用

      2.5.3 視圖處理函數(shù)的使用

      • render()

        render(request, template_name,content=None,content_typw=None,status=None,using=None)

        • request: 傳遞給視圖函數(shù)的所有請求,其實就是視圖函數(shù)的參數(shù)request
        • template_name:渲染的模板文件,一般放在templates目錄下
        • content:數(shù)據(jù)格式為字典類型,保存要傳遞到HTML文件中的變量
        • content_type:用于生成文檔的MIME類型。默認(rèn)為text/html
        • status:表示響應(yīng)的狀態(tài)代碼,默認(rèn)為200
        • using:設(shè)置模板引擎,用于解析模板文件
      • redirect():實現(xiàn)頁面重定向

      三、DJango模板

      3.1 變量

      • {{ var }}:直接調(diào)用變量
      • {{ lst.0 }}:根據(jù)索引調(diào)用列表
      • {{ dicts.name }}:根據(jù)key調(diào)用字典

      3.2 模板標(biāo)簽

      模板標(biāo)簽 描述
      {% if %} 條件判斷模板標(biāo)簽
      {% for foo in %} 循環(huán)模板標(biāo)簽
      路由配置地址標(biāo)簽
      模板繼承標(biāo)簽,從xx模板繼承
      加載相關(guān)內(nèi)存
      靜態(tài)資源
      {% block %} 一組占位符標(biāo)簽,需要重寫模板
      用來防護(hù)跨站請求偽造攻擊
      包含一個HTML頁面
      • 循環(huán)模板標(biāo)簽
      變量 含義
      forloop.counter 表示當(dāng)前循環(huán)的索引,從1開始計數(shù)
      forloop.counter0 表示當(dāng)前循環(huán)的索引,從0開始計數(shù)
      forloop.revcounter 表示循環(huán)中剩余元素的數(shù)量。在進(jìn)行第1次循環(huán)時,forloop.revcounter的值是循環(huán)的序列中元素的總數(shù)。在進(jìn)行最后一次循環(huán)時,forloop.revcounter的值是1
      forloop.revcounter0 表示循環(huán)中剩余元素的數(shù)量。在進(jìn)行第1次循環(huán)時,forloop.revcounter的值是循環(huán)的序列中元素的總數(shù)。在進(jìn)行最后一次循環(huán)時,forloop.revcounter的值是0
      forloop.first 表示是否是第1次循環(huán)
      forloop.last 表示是否是最后一次循環(huán)
      forloop.parentloop 在嵌套循環(huán)中,獲取上層的for循環(huán)

      3.3.模板過濾器

      模板過濾器 格式 描述
      safe {{ name|safe }} 關(guān)閉HTML標(biāo)簽和JavaScript腳本的語法標(biāo)簽的自動轉(zhuǎn)義功能
      length {{ name|length }} 獲取模板變量的長度
      default {{ name|default:"默認(rèn)值" }} 當(dāng)變量的值為False時,顯示默認(rèn)值
      date {{ name|date:"Y-m-d G:i:s" }} 格式化輸出時間日期變量
      upper {{ name|upper }} 將字符串轉(zhuǎn)為大寫
      lower {{ name|lower }} 將字符串轉(zhuǎn)為小寫
      slice {{ name|slice:"2:4"}} 以切片方式獲取字符串中的一部分,和Python中切片語法一樣
      • 日期過濾器格式化

        • Y表示年:格式為4位。y表示兩位的年。
        • m表示月:格式01、02、12等。
        • d表示日:格式01、02等。
        • j表示日:格式為1、2等。
        • H表示二十四進(jìn)制的"時",h表示十二進(jìn)制的"時"。
        • i表示分:值為0~59。
        • s表示秒:值為0~59。
      • 自定義過濾器

        • 在應(yīng)用下創(chuàng)建templatetags的包

        • 在包下創(chuàng)建myfilter.py文件

          image-20221001203732967

        • 編寫自定義過濾器并注冊

        from django import template
        
        register = template.Library()
        
        
        @register.filter    # 指明show_title函數(shù)是一個過濾器
        def show_title(value, n):   # value指的是文章標(biāo)題  n指標(biāo)題要顯示的長度
            if len(value) > n:
                return f'{value[0:n]}...'
            else:
                return value
        
        • 模板調(diào)用過濾器
        {% load show_title %}
        

      四、使用數(shù)據(jù)庫models

      4.1 常用模型字段

      模型字段 說明 MySQL數(shù)據(jù)庫對應(yīng)的字段類型
      AutoField 數(shù)據(jù)庫中的自動增長類型,相當(dāng)于ID自動增長的IntegerField類型字段 Int類型
      BooleanField 一個真/假(true/false)的布爾類型字段 Tinyint類型
      CharField 字符類型字段 varChar類型
      DateField 日期字段 Date類型
      DateTimeField 日期時間類型字段 DateTime類型
      IntergerField 整數(shù)類型字段 Int類型
      TextField 長文本類型字段 Longtext類型
      TimeField 時間類型字段 Time類型
      FloatField 浮點數(shù)類型字段 Double類型
      FileField 文件類型字段 varChar類型
      ImageField 圖像類型字段 varChar類型
      DecimalField 數(shù)值型類型字段 Decimal類型
      • 數(shù)字型字段DecimalField
        • max_digits:數(shù)字允許的最在位數(shù)
        • decimal_places:小數(shù)的最大位數(shù)
      • 時間日期類型字段
        • auto_now_add:默認(rèn)為False,設(shè)置為True自動添加創(chuàng)建時間
        • auto_now:默認(rèn)為False,設(shè)置為True自動添加修改時間

      4.2 常用字段參數(shù)

      字段參數(shù) 含義
      verbose_name 設(shè)置字段的顯示名稱
      primary_key 設(shè)置字段為主鍵
      editable 是否可以編輯,一般用于Admin后臺
      max_length 設(shè)置字段的最大長度
      blank 若為True,則該字段允許為空值,在數(shù)據(jù)庫中表現(xiàn)為空字符串。默認(rèn)為False
      null 若為True,則該字段允許為空值,在數(shù)據(jù)庫中表現(xiàn)為null。默認(rèn)為False
      default 設(shè)置字段的默認(rèn)值
      choices 設(shè)置字段的可選值
      db_column 設(shè)置表中的列名稱,如果不設(shè)置,則將字段名作為列名稱
      db_index 數(shù)據(jù)庫中的字段是否可以建立索引
      unique 數(shù)據(jù)庫中字段是否可以建立 唯一索引
      error_messages 自定義錯誤信息(字典類型)
      validators 自定義錯誤驗證(列表類型)

      4.3 Meta類

      參數(shù) 含義
      abstract 若為True,則該模型類為抽象類
      db_table 設(shè)置模型對象的數(shù)據(jù)表名稱。若不設(shè)置,則默認(rèn)設(shè)置數(shù)據(jù)表名稱為"應(yīng)用名+下劃線+模型類名"
      managed 默認(rèn)為True.Django會管理數(shù)據(jù)表的生命周期,包括遷移等
      ordering 模型對象返回的記錄結(jié)果集按照那個字段排序。一般如下設(shè)置:Ordering=["create_date"]:按照創(chuàng)建時間升序排序,Ordering=["-create_date"]:按照創(chuàng)建時間降序排列,Ordering=["-create_date","orderid"]:按照創(chuàng)建時間降序排列,再以訂單編號升序排列
      verbose_name 模型類在后臺管理中顯示的名稱,一般為中文
      index_logether 多個字段的聯(lián)合索引
      unique_together 多個字段 的聯(lián)合約束
      # explame
      class Meta:
          managed=False # 不做數(shù)據(jù)遷移等操作
          verbose_name='人員基本信息' # 顯示信息
          db_table = 'UerBaseInfo' # 設(shè)置數(shù)據(jù)庫中的表名
      

      4.4 模型中的關(guān)系

      4.4.1 一對一關(guān)系OneToOneField()

      • 參數(shù)表

        參數(shù) 含義
        to 要進(jìn)行關(guān)聯(lián)的模型名稱
        to_field 要進(jìn)行關(guān)聯(lián)的表的字段名稱
        on_delete 在刪除關(guān)聯(lián)表中的數(shù)據(jù)時使用的配置選項
        • ondelete參數(shù)配置選項表
        配置選項 含義
        CASCADE 在刪除基本信息表時一并刪除擴(kuò)展表的信息,即級聯(lián)刪除
        PROTECT 在刪除基本信息表時采用保護(hù)機(jī)制拋出錯誤,即不刪除擴(kuò)展表的內(nèi)容
        SET_NULL 只有當(dāng)字段屬性null=True時才將關(guān)聯(lián)的內(nèi)容置空
        SET_DEFAULT 設(shè)置為默認(rèn)值
        SET 設(shè)置為指定的值
        DO_NOTHING 刪除基本信息表,對擴(kuò)展表不做任何操作

      4.4.2 一對多關(guān)系ForeignKey()

      參數(shù) 含義
      to 要進(jìn)行關(guān)聯(lián)的模型名稱
      to_field 要進(jìn)行關(guān)聯(lián)的表的字段名稱
      on_delete 在刪除關(guān)聯(lián)表中的數(shù)據(jù)時使用的配置選項
      related_name=None 在反向操作時使用的字段名,用于代替【表名_set】。如obj.表名_set.all()
      related_query_name=None 在反向操作時使用的連接前綴, 用于替換【表名】。如modles.UserGroup.objects.filter(表名_字段名=1).values('表名_字段名')
      db_constraint=True 是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束

      4.4.3 多對多關(guān)系

      參數(shù) 含義
      to 要進(jìn)行關(guān)聯(lián)的模型名稱
      db_constraint=True 是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束
      db_table=None 默認(rèn)創(chuàng)建的多對多關(guān)系表的表名

      4.5 配置項目文件

      • setting配置
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',   # 配置為mysql
              'NAME': 'shop-test',                    # 數(shù)據(jù)庫名
              'USER': 'root',                         # 數(shù)據(jù)庫登錄賬戶
              'PASSWORD': '123456',                   # 登錄密碼
              'HOST': 'localhost',                    # 數(shù)據(jù)庫IP地址
              'PORT': '3306',                         # 數(shù)據(jù)庫端口號
              # 取消外鍵約束
              'OPTIONS': {
                  "init_command": "SET foreign_key_checks = 0;",
              }
          }
      }
      
      • 執(zhí)行命令
      # 生成遷移文件
      python manage.py makemigrations
      # 執(zhí)行遷移
      python manage.py migrate
      

      4.5.1 配置日志打印輸出

      LOGGING = {
          'version': 1,
          'disable_existing_loggers': False,
          'handlers': {
              'console': {
                  'level': 'DEBUG',
                  'class': 'logging.StreamHandler',
              },
          },
          'loggers': {
              'django.db.backends': {
                  'handlers': ['console'],
                  'propagate': True,
                  'level': 'DEBUG',
              },
          }
      }
      

      4.6 ORM

      • all()方法 :獲取模型的QuerySet對象,即獲取所有的數(shù)據(jù)。
      • filter()方法:返回一個QuerySet對象,如果滑獲取數(shù)據(jù),則返回空的QuerySet對象。

      模型類.objects.filter(字段=值)

      • get()方法:查詢數(shù)據(jù)表記錄,以模型對象的形式返回符合要求的一條數(shù)據(jù)。當(dāng)沒有查詢到結(jié)果或者超過一條記錄,會出現(xiàn)錯誤提示。
      • exclude()方法:該方法排除符合條件的數(shù)據(jù),返回QuerySet對象。

      模型類.objects.exclde(字段=值)

      操作符 含義 具體使用
      __gt 大于 filter(age__gt=20)
      __gte 大于等于 filter(age__gte=20)
      __lt 小于 filter(age__lt=20)
      __lte 小于等于 filter(age__lte=20)
      __in 在某個列表內(nèi) filter(sex__in=[1,0])
      __contains 模糊匹配 filter(username__contains='張')
      __year 日期字段的年份 filter(createdate__year=2022)
      __month 日期字段的月份 filter(createdate__month=10)
      __day 日期字段的天數(shù) filter(createdate__day=2)
      • values()方法:提取指定需要的字段 。它返回一個QuerySet對象。
      • distinct()方法:該方法用于去除重復(fù)數(shù)據(jù)。它返回一個QuerySet對象。

      4.6.1 查詢數(shù)據(jù)

      • all()
      • filter()
      • get()

      4.6.2 新增數(shù)據(jù)

      • 使用save()方法新增數(shù)據(jù)
      from app import models
      depart=models.DepartInfo(departname="技術(shù)部")
      depart.save()
      
      • 使用create()方法新增
      UserBaseInfo.objects.create(username="張三",password="123456")
      

      4.6.3 更新數(shù)據(jù)

      • 單條數(shù)據(jù)更新
      one_user = UserExtraInfo.objects.get(id=1)
      one_user.username="王五"
      one_user.save()
      
      • 多條數(shù)據(jù)更新
      models.objects.update(status=1)  # 所有用戶狀態(tài)更新為1
      

      4.6.4 刪除數(shù)據(jù)

      • 刪除單選數(shù)據(jù)

      UserBasicInfo.objects.get(id=1).delete()

      • 刪除多選數(shù)據(jù)

      UserBasicInfo.objects.filter(status=2).delete()

      • 刪除全部數(shù)據(jù)

      UserBasicInfo.objects.all().delete()

      4.6.5 操作關(guān)聯(lián)表

      • 一對一關(guān)聯(lián)表操作

      • 一對多關(guān)聯(lián)表操作

      • 多對多關(guān)聯(lián)表操作

      • select_related()方法

      cards = models.CardInfo.objects.select_related("user")
      
      • prefetch_related()方法:同select_related()方法類似,用于解決“多對一”和“多對多”關(guān)系的查詢問題。
      skills = SkillInfo.objects.prefetch_related("user")
      

      4.6.6 F()函數(shù)和Q()函數(shù)

      • F()函數(shù):用于實現(xiàn)數(shù)據(jù)表中字段 的各種運算操作。
      from django.db.models import F
      # 給所有用戶+1000
      users = UserExtraInfo.objects.all()
      for user in users:
          user.salary+=1000
          user.save()
          
      # 使用F增加效率
      for user in users:
          user.salary=F("salary")+100
          user.save()
      
      • Q()函數(shù):用于對象進(jìn)行多條件查詢。
      from django.db.models import Q
      user = UserExtraInfo.objects.filter(Q(age__gt=30)&Q(salary__gt=5000))
      

      4.7 執(zhí)行原生SQL

      • Raw()方法返回RawQuerySet對象

        django.db.models.Manager.raw(raw_query)

        • 基本使用

          UserExtraInfo.objects.raw("select * from userbaseinfo")

        • 條件查詢(帶參數(shù))

        name="張三"
        sql='''select * from userextrainfo where username=%s'''
        users = UserExtraInfo.objects.raw(sql,[name])
        
      • 游標(biāo)方法

        • 插入數(shù)據(jù)
        from django.db import connection
        import django.utils.timezone as timezone
        cursor = connection.cursor()
        insertsql="insert into departinfo(departname,createdate) values(%s,%s)"
        data = ('總經(jīng)辦',timezone.now())
        cursor.exectue(insertsql,data)
        cursor.close()
        
        • 查詢數(shù)據(jù)
        from django.db import connection
        cursor = connection.cursor()
        cursor.exectue("select * from userextrainfo")
        row = cursor.fetchone()		# 以元組方式返回一條記錄
        print(row)
        cursor.close()
        
        • 更新數(shù)據(jù)
        from django.db import connection
        cursor = connection.cursor()
        try:
            updatesql = 'update departinfo set departname=%s where id=%s'
            data=('銷售部', 2)
            cursor.execute(updatesql,data)
            rowcount=cursor.rowcount		# 影響行數(shù)
            connection.commit()
        except:
            connection.rollback()
            
        # 返回參數(shù)為影響行數(shù)
        
        • 刪除數(shù)據(jù)
        cursor=connection.cursor()
        sql="delete from departinfo where departname = %s"
        data=["總經(jīng)辦"]
        cursor.execute(sql,data)
        cursor.close()
        

        4.8 事務(wù)處理

        4.8.1 裝飾器方式

        from django.db import transaction
        @transaction.atomic	# 裝飾器
        def trans(request):
            # 開啟事務(wù)
            save_id=transaction.savepoint()
            try:
                	# 代碼操作 1
                    # 代碼操作 2
                # 提交從保存點以當(dāng)前狀態(tài)的所有數(shù)據(jù)庫事務(wù)操作
                transaction.savepoint_commit(save_id)
            except:
                # 事務(wù)回滾,回滾到保存點
                transaction.savepoint_rollback(save_id)
        

        4.8.2 with語句方式

        def trans_with(request):
            with transaction.atomic():		# with語句
                # 開啟事務(wù)
                save_id = transaction.savepoint()
                try:
                    # 代碼操作 1
                    # 代碼操作 2
                	# 提交從保存點以當(dāng)前狀態(tài)的所有數(shù)據(jù)庫事務(wù)操作
               		transaction.savepoint_commit(save_id)
                except:
                    # 事務(wù)回滾,回滾到保存點
                    transaction.savepoint_rollback(save_id)
        

      五、基于Django表單

      5.1 HTML表單

      標(biāo)簽 說明
      <form> 表單標(biāo)簽
      <input type=text> 文本框標(biāo)簽
      <input type=password> 密碼輸入框標(biāo)簽
      <input type=radio> 單選框標(biāo)簽
      <input type=checkbox> 復(fù)選框標(biāo)簽
      <input type=button> 按鈕標(biāo)簽
      <input type=submit> 提交按鈕標(biāo)簽
      <input type=reset> 重置按鈕標(biāo)簽
      <input type=file> 文件上傳標(biāo)簽
      <textarea> 多選文本標(biāo)簽
      <label> 顯示文本標(biāo)簽
      <select> 下拉列表框標(biāo)簽
      <option> 下拉列表框中的選項

      5.2 Form表單

      form表單,用于生成頁面可用的HTML標(biāo)簽。用戶在表單中輸入數(shù)據(jù)提交表單時,Django框架會自動進(jìn)行表彰數(shù)據(jù)驗證,并將數(shù)據(jù)綁定到表單對象。

      表單字段 說明
      CharField 字符型字段,默認(rèn)在界面上顯示一個文本輸入標(biāo)簽。如<input type='text' ...>
      InterField 數(shù)值類型字段,默認(rèn)在界面上顯示 一個數(shù)字輸入標(biāo)簽。如<input type='number'...>
      FloatField 數(shù)值類型字段,默認(rèn)在界面上顯示一個數(shù)字輸入標(biāo)簽。如<input type='number'...>
      DecimalField 數(shù)值類型字段,默認(rèn)在界面上顯示<input>類型的數(shù)字輸入標(biāo)簽。如<input type='number'...>
      ChoiceField 選擇屬性字段,默認(rèn)在界面上顯示一個下拉列表標(biāo)簽。如<select name="city" id="city" ...>
      FileField 文件屬性字段,默認(rèn)在界面上顯示 一個文件域標(biāo)簽。如<input type='file'...>
      BooleanField 布爾類型字段,默認(rèn)在界面上顯示 一個復(fù)選框標(biāo)簽。如<input type='checkbox'...>
      DateField 日期屬性字段,默認(rèn)顯示 一個文本輸入標(biāo)簽,可以自動驗證日期格式。<input type='text' ...>
      DateTimeField 日期時間屬性字段,默認(rèn)顯示 一個文本輸入標(biāo)簽,可以自動驗證日期時間格式。如<input type='text' ...>
      EmailField 郵件屬性字段,默認(rèn)顯示一個郵件輸入標(biāo)簽。如<input type='email'...>
      UrlField URL地址屬性字段,默認(rèn)顯示一個URL地址輸入標(biāo)簽,可以自動校驗URL格式的合法性。如<input type='text' ...>
      ModelChoiceField 如果使用了該字段,則可以直接從數(shù)據(jù)庫中獲取數(shù)據(jù)生成下拉 列表組件。<select name="city" id="city" ...>
      • ChoiceField

      Forms.ChoiceField(choices=((None,'請選擇'),(0,'正常'),(1,'無效'),))

      • 時間日期類型字段

      Forms.DateTimeField(input_format=["%Y-%m-%d %H:%M"])

      Forms.DateField(input_format=["%Y-%m-%d"])

      • 選擇類型字段ModelChoiceField

      Forms.ModelChoiceField(queryset=DepartInfo.objects.all(), empty_label="請選擇")

      5.2.1 常用字段

      字段參數(shù) 說明
      label 生成HTML中的label標(biāo)簽
      label_suffix Label標(biāo)簽后的統(tǒng)一后綴信息
      initial 字段的初始值
      help_text 字段的描述信息
      error_messages 指定錯誤信息
      validators 指定字段的驗證規(guī)則
      required 字段是否可以為空,默認(rèn)為True
      disabled 字段是否可以編輯
      widget 指定字段HTML標(biāo)簽樣式
      • 表單元素風(fēng)格(widget)
      widget 說明
      PasswordInput 密碼輸入標(biāo)簽
      HiddenInput 隱藏元素輸入標(biāo)簽
      Textarea 文本域標(biāo)簽
      CheckboxInput 復(fù)選框標(biāo)簽
      FileInput 文件域標(biāo)簽
      RadioInput 單選按鈕標(biāo)簽
      DateTimeInput 日期時間標(biāo)簽
      Select 下拉列表標(biāo)簽
      SelectMuliple 下拉多選列表標(biāo)簽
      • explame
      from django import forms
      class UserInfoForm(forms.Form):
          STATUS=((None, '請選擇'),(0,'正常'),(1, '無效'),)
          username=forms.CharField(label="用戶名",min_length=6,
                                   widget=forms.widgets.TextInput(attrs={
                                       'class':'form-control',
                                       'placeholder':'請輸入用戶名'
                                   }))
          password=forms.CharField(label="密碼",min_length=6,
                                   widget=forms.widgets.TextInput(attrs={
                                       'class':'password',
                                   },render_value=True))
      

      5.2.2 表單數(shù)據(jù)校驗

      表單屬性或方法 說明
      is_valid()方法 驗證表單中的數(shù)據(jù)是否合法
      cleand_data屬性 獲取表單中通過驗證的數(shù)據(jù)
      errors屬性 表單驗證錯誤信息
      • 自定義驗證規(guī)則
      from django.core.exceptions import ValidationError
      imoprt re
      def mobile_validate(value):
          # 手機(jī)號正則判斷
          mobile_re=re.compile(r'^(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
          if not mobile_re.match(value):
              raise ValidationError('手機(jī)號碼格式錯誤')
      def age_validate(value):
          if value<1 | value>120:
              raise ValidationError('年齡范圍為1~120歲')
      

      5.3 Django的模型表單

      from app.models import *
      class UserInfoModelForm(forms.ModelForm):
          class Meat:
              # 定義關(guān)聯(lián)模型
              model=UserBaseInfo
              # 定義需要在表單中展示的字段
              fields=['username','password','age','mobile','status']
              # 如果要顯示全部字段,則可以如下設(shè)置
              # fileds="__all__"
      
      • 模型表單屬性表
      模型表單屬性 含義
      model 用于綁定已有的模型
      fields 設(shè)置模型中的哪些字段可以顯示。如果將值設(shè)為__all__,則顯示全部字段。如果要顯示部分字段,則將部分字段寫入一個列表或元組中
      exclude 禁止將模型字段轉(zhuǎn)換為表單字段。用法同fields
      labels 設(shè)置表單字段的label項,以字典方式表示 ,字典的鍵為模型的字段
      widgets 設(shè)置表單字段的渲染效果,以字典方式表示,字典的鍵為模型的字段
      help_texts 設(shè)置表單字段的幫助信息
      error_messages 設(shè)置表單字段 的錯誤信息

      5.3.1 校驗數(shù)據(jù)

      from app.models import *
      class UserBaseInfoModelForm(forms.ModelForm):
          class Meta:
              # 定義關(guān)聯(lián)模型
              model=UserBaseInfo
              # 定義需要在表單中展示的字段 
              fields=['username','password','age','mobile','status']
              # 如果要顯示全部字段,則可以進(jìn)行如下設(shè)置
              # fields="__all__"
              # 如果在Models中定義了名稱,則在這里不用再定義
              labels={
                  'age':'年齡',
                  "mobile":"手機(jī)信息",
              }
              # 將文本框渲染為密碼輸入框
              widgets={
                  "password":forms.widgets.PasswordInput(attrs={"class":"password"},render_value=True)
              }
              error_message={
                  "username":{'required':"用戶姓名不能為空","min_length":"長度最少6們",'invalid':'輸入正確的用戶姓名'},
                  "password":{'max_length':'密碼最長10位','required':'密碼不能為空','min_length':'密碼最少6位'},
                  "age":{'required':'年齡不能為空'},
                  "mobile":{'required':'手機(jī)號不能為空'},
                  "status":{'required':'用戶狀態(tài)不能為空'}
              }
      

      5.3.2 自定義校驗函數(shù)

      # 校驗手機(jī)號碼的局部鉤子函數(shù)
      def clean_mobile(self):
          mobile = self.cleaned_data.get('mobile')
          mobile_re=re.compile(r'^(13[0-9]|15[0123456789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
          if not mobile_re.match(mobile):
              raise ValidationError('手機(jī)號碼格式錯誤')
          return mobile
      
      # 全局鉤子函數(shù)
      def clean(self):
          password = self.cleaned_data.get("password")
          confirm_password = self.cleaned_data.get("confirm_password")
          if password != confirm_password:
              raise forms.ValidationError('二次密碼輸入不一致')
      

      5.4使用AJAX提交表單

      <scripts>
      	$("#submit").click(funtion(){
               $.ajax({
               	url:"/ajax_login/",
                  async:true,
                  type:"post",
                  data:{
                             "username":username,
                             "password":password,
                             "csrfmiddlewaretoken":$('[name=csrfmiddlewaretoken]').val(),
                        },
                 success:function(data){
                     console.log(data)
                 },
                 error:function(data){
                     console.log("error")
                 }
               })
      	})    
      </scripts>
      

      六、用戶認(rèn)證

      6.1 Auth模塊

      模塊名稱 說明
      Django.contrib.auth.models.User Auth模塊中的用戶模型
      Django.contrib.auth.models.Group Auth模塊中的用戶組模型
      Django.contrib.auth.models.Permission Auth模塊中的權(quán)限模型
      • 內(nèi)置字段
      字段 說明 字段類型
      id 數(shù)據(jù)庫主鍵 int
      password 密碼 varchar
      last_login 最近登錄的時間 datetime
      is_superuser 是否為超級管理員 tinyint
      username 用戶賬號 varchar
      first_name 用戶名字 varchar
      last_name 用戶姓氏 varchar
      email 郵箱 varchar
      is_staff 是否登錄admin后臺 tinyint
      is_active 用戶狀態(tài)是否激活 tinyint
      date_joined 賬號的創(chuàng)建時間 datetime
      • Auth模塊的相關(guān)方法
      方法 說明
      authenticate(username,pasword) 用戶驗證功能,如果認(rèn)證成功,則返回一個User對象
      login(HttpRequest,user) 用戶登錄功能,其中,user為一個經(jīng)過認(rèn)證的User對象。登錄成功后將用戶身份信息記錄到請求的會話對象中存儲。使用request.user可以獲取當(dāng)前用戶的用戶對象。如果未登錄,則request.user得到一個匿名用戶對象AnonymousUser
      is_authenticated() 判斷當(dāng)前用戶是否經(jīng)過認(rèn)證
      logout() 清除當(dāng)前請求,注銷會話
      create_user() 創(chuàng)建新用戶,至少提供用戶名和密碼
      set_password(password) 修改密碼
      check_password(password) 檢查密碼是否正確

      6.2 擴(kuò)展用戶模型

      用戶模型中的字段是有限的,無法滿足實際業(yè)務(wù)需求。

      # 一、models創(chuàng)建
      from django.db import models
      from django.contrib.auth.models import AbstractUser
      class MyUser(AbstractUser):
          photo = models.ChafrField('用戶頭像',max_length=50)
          weChat=models.CharField('微信',max_length=30)
          level=models.CharField('用戶等級',max_length=1)
          def __str__(self):
              return self.username
          
      # 二、setting.py添加如下
      AUTH_USER_MODEL="app.MyUser"
      
      # 三、數(shù)據(jù)遷移
      python manage.py makemigrations
      python manage.py migrate
      

      6.3 權(quán)限管理

      6.3.1 裝飾器權(quán)限

      裝飾器 含義
      login.required 用戶身份認(rèn)證資源訪問裝飾器,驗證用戶是否通過身份認(rèn)證。如果通過認(rèn)證,則允許該用戶訪問該裝飾器關(guān)聯(lián)的函數(shù),否則跳轉(zhuǎn)到login_url參數(shù)所指定的登錄地址。如果不提供login_url參數(shù),則跳轉(zhuǎn)到setting.py中的LOGIN_URL路徑
      permission_required 數(shù)據(jù)資源訪問裝飾器,驗證用戶是否擁有指定權(quán)限。如果通過認(rèn)證了,則允許該用戶訪問該裝飾器關(guān)聯(lián)的函數(shù),否則跳轉(zhuǎn)到login_url參數(shù)所指定的登錄 地址。如果不提供login_url參數(shù),則跳轉(zhuǎn)到setting.py中的LOGIN_URL路徑
      Require_GET 請求訪問限制裝飾器,只允許使用GET方式訪問函數(shù)
      Require_POST 請求訪問限制裝飾器,只允許使用POST方式訪問函數(shù)
      • 在用戶通過身份認(rèn)證后,可以通過以下方法進(jìn)行用戶組和權(quán)限的增加、刪除、修改和查詢
      方法 含義
      user.groups.set(group1,group2) 為指定用戶配置用戶組
      user.groups.remove(group1,group2) 從指定用戶組中刪除用戶
      user.groups.clear() 將用戶從所有的用戶組中刪除
      user.user_permissions.set(per1,per2) 為指定的用戶配置權(quán)限
      user.user_permissions.remove(per1,per2) 刪除當(dāng)前用戶的權(quán)限中指定的權(quán)限
      user.user_permissions.clear() 刪除當(dāng)前用戶所有的權(quán)限
      user.has_perm('app.add_departinfo') 檢查用戶是否擁有app應(yīng)用的departinfo模型的添加權(quán)限

      6.3.2 中間件技術(shù)

      • 方法
      方法 說明
      process_request(self,request) 在處理請求前在每個請求上調(diào)用,返回None或HttpResponse對象
      process_view(self,request,callback,callback_args,callback_kwargs) 在處理視圖前在每個請求上調(diào)用,返回None或HttpResponse對象
      process_emplate_response(self,request,response) 如果views()函數(shù)中返回的對象中具有render()方法,則直接執(zhí)行該方法。在每個請求上調(diào)用,返回實現(xiàn)了render()方法的響應(yīng)對象
      process_exception(self,request,exception) 在視圖拋出異常時調(diào)用,在每個請求上調(diào)用,返回一個HttpResponse對象
      process_response(self,request,response) 在處理響應(yīng)后,所有響應(yīng)返回瀏覽器之前被調(diào)用,在每個請求上調(diào)用,返回HttpResponse對象
      • 自定義中間件

        • 在項目根目錄創(chuàng)建類:my_middleware.py
        from django.utils.deprecation import MiddlewareMixin
        
        class test(MiddlewareMixin):
            def process_request(self)
            	pass
        
        • 在setting.py中MIDDLEWARE添加my_middleware.test
      • 中間件簡化權(quán)限認(rèn)證

        • 新建文件permimiddleware
      from django.shorttcuts import HttpResponse,render,redirect
      from django.utils.deprecation import MiddlewareMixin
      import re 
      class PermissionMiddleWare(MiddlewareMixin):
      	def process_request(self,request):
                # 獲取當(dāng)前路徑
                curr_path = request.path
                # 白名單處理
                white_list=["/myuser_login","/myuser_reg/"]
                for w in white_list:
                    if re.search(w, curr_path):
                        return None	# 通過
                # 驗證是否通過
                if not request.user.is_authenticated:
                    return redirect("/app/myuser_login")
      
      • 配置中間件
      # setting.py
      MIDDLEWARE=[
          ...
          'app.middle.permiddleware.PermissionMiddleWare',
      ]
      
      posted @ 2022-10-02 15:55  ?Python?  閱讀(279)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 库伦旗| 夜夜爽免费888视频| 国产精品免费久久久免费| 中文字幕亚洲人妻一区| 熟女一区| 大地资源网第二页免费观看| 国产成人精品18| a级国产乱理伦片在线观看al| 国产一区二区三区高清视频| 国偷自产一区二区三区在线视频| 久久久久久免费一区二区三区| 国产999精品2卡3卡4卡| 一本久道久久综合中文字幕| 精品国产中文字幕懂色| 亚洲色欲在线播放一区| 午夜福利国产精品视频| 亚洲精品成人片在线播放| 2020国产成人精品视频| 欧洲亚洲成av人片天堂网| 成人性影院| 人妻少妇精品中文字幕| 国产亚洲精品aaaa片app| 韩国无码AV片午夜福利| 驻马店市| 精品国产av无码一区二区三区| 蜜臀av久久国产午夜| 欧美大香线蕉线伊人久久| 亚洲日本韩国欧美云霸高清| 起碰免费公开97在线视频| 九九久久自然熟的香蕉图片| 亚洲中文字幕无码av永久| 久久精品国产亚洲av品| 国产小嫩模无套中出视频| 四虎精品永久在线视频| 在线日韩日本国产亚洲| 亚洲欧美偷拍另类A∨| 亚洲熟女精品一区二区| 日区中文字幕一区二区| 中国女人熟毛茸茸A毛片| 成人亚洲综合av天堂| 鲁一鲁一鲁一鲁一澡|