日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > HTML >内容正文

HTML

【前端开发学习】7.Django

發(fā)布時(shí)間:2024/1/1 HTML 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【前端开发学习】7.Django 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1 初識(shí)Django
    • 1.1 django的安裝
    • 1.2 創(chuàng)建django項(xiàng)目
    • 1.3 兩種創(chuàng)建方式的對(duì)比
    • 1.4 默認(rèn)文件介紹
    • 1.5 APP的創(chuàng)建和說(shuō)明
    • 1.6 啟動(dòng)運(yùn)行django
    • 1.7 模板和靜態(tài)文件
    • 1.8 模板語(yǔ)法
    • 1.9 請(qǐng)求和響應(yīng)
    • 1.10 orm數(shù)據(jù)庫(kù)操作
    • 1.11 ORM 數(shù)據(jù)庫(kù)案例:用戶(hù)管理
  • 2 案例
    • 2.1 創(chuàng)建項(xiàng)目和 APP
    • 2.2 表結(jié)構(gòu)的創(chuàng)建
    • 2.3 生成數(shù)據(jù)庫(kù)
    • 2.4 部門(mén)管理
    • 2.5 數(shù)據(jù)庫(kù)數(shù)據(jù)
    • 2.6 添加部門(mén)頁(yè)面
    • 2.7 部門(mén):添加
    • 2.8 部門(mén):刪除
    • 2.9 部門(mén):編輯
    • 2.10 模板繼承
    • 2.11 用戶(hù)管理:列表
    • 2.12 用戶(hù)管理:添加
      • 1. 思路
      • 2. 原始方法
      • 3.Form
      • 4. ModelForm
      • 5. 使用 ModelForm 添加用戶(hù)
      • 6. 添加的錯(cuò)誤提示
    • 2.13 用戶(hù)管理:編輯
    • 2.14 用戶(hù)管理:刪除
  • 3 案例:靚號(hào)管理
    • 3.1 表結(jié)構(gòu)
    • 3.2 靚號(hào)列表
    • 3.3 新建靚號(hào)
    • 3.4 編輯靚號(hào)
    • 3.5 刪除靚號(hào)
    • 3.6 靚號(hào)管理:手機(jī)號(hào)搜索
    • 3.7 靚號(hào)管理:分頁(yè)
  • 4 時(shí)間選擇組件
  • 5 BootStrap 樣式父類(lèi)
  • 6 views 函數(shù)拆分
  • 7 案例:管理員
    • 7.1

1 初識(shí)Django

1.1 django的安裝

pip install django

1.2 創(chuàng)建django項(xiàng)目

  • cmd命令行創(chuàng)建
# 已經(jīng)進(jìn)行了環(huán)境變量配置 django-admin.exe startproject 項(xiàng)目名稱(chēng)
  • Pycharm 【需要專(zhuān)業(yè)版】

1.3 兩種創(chuàng)建方式的對(duì)比

  • 命令行,創(chuàng)建的項(xiàng)目是比較標(biāo)準(zhǔn)的;
  • Pycharm,與命令行方式對(duì)比:
    • 增加了templates目錄;【刪除】
    • setting.py中,TEMPLATES = [{ ‘DIRS’: [’ ******* ']}] 【DIRS中的內(nèi)容刪除】

1.4 默認(rèn)文件介紹

mysite

  • manage.py 【項(xiàng)目管理,啟動(dòng)項(xiàng)目、創(chuàng)建APP、數(shù)據(jù)管理】- 不修改,常用
  • mysite
    • __ init __.py
    • settings.py 【項(xiàng)目配置文件】- 常常操作
    • urls.py 【URL和函數(shù)的對(duì)應(yīng)關(guān)系】- 常常操作
    • asgi.py 【接收網(wǎng)絡(luò)請(qǐng)求「異步式」】- 不修改
    • wsgi.py 【接收網(wǎng)絡(luò)請(qǐng)求「同步式」】- 不修改

1.5 APP的創(chuàng)建和說(shuō)明

1. APP 的例子

  • 項(xiàng)目

    • app,用戶(hù)管理 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
    • app,訂單管理 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
    • app,后臺(tái)管理 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
    • app,網(wǎng)站 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】
    • app,API 【表結(jié)構(gòu)、函數(shù)、HTML模板、CSS】

    注意,我們開(kāi)發(fā)比較簡(jiǎn)潔,用不到多 APP ,通常情況下,項(xiàng)目創(chuàng)建一個(gè) APP 即可。

2. 創(chuàng)建 APP,在終端輸入:

python manage.py startapp app01

3. APP 默認(rèn)文件介紹

  • app01
    • __ init __.py
    • admin.py【固定,不用動(dòng)】 django默認(rèn)提供了admin后臺(tái)管理
    • apps.py 【固定,不用動(dòng)】 app啟動(dòng)類(lèi)
    • migrations 【固定,不用動(dòng)】 數(shù)據(jù)庫(kù)字段變更記錄
      • __ init __.py
    • models.py重要】 對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作
    • tests.py【固定,不用動(dòng)】 單元測(cè)試
    • views.py重要】 函數(shù)

1.6 啟動(dòng)運(yùn)行django

1. 注冊(cè) app 【setting.py】

2. 編寫(xiě) URL 和視圖函數(shù)的對(duì)應(yīng)關(guān)系 【urls.py】

3. 編寫(xiě)視圖函數(shù) 【views.py】

4. 啟動(dòng) Django 項(xiàng)目

命令行啟動(dòng)

python manage.py runserver


1.7 模板和靜態(tài)文件

1. templates 模板


2. 靜態(tài)文件

在開(kāi)發(fā)過(guò)程中,一般將 「圖片、CSS、js」都會(huì)當(dāng)作靜態(tài)文件處理。

(1)在 app 目錄下創(chuàng)建static文件夾

(2)引用靜態(tài)文件

1.8 模板語(yǔ)法

1. 本質(zhì):在 HTML 中寫(xiě)一些占位符,由數(shù)據(jù)對(duì)這些占位符進(jìn)行替換和處理。

2. 案例:偽聯(lián)通新聞中心

(1)在 urls.py 創(chuàng)建函數(shù)的對(duì)應(yīng)關(guān)系

(2)在 views 中編寫(xiě)函數(shù)

(3)在 templates 的 news.html 編寫(xiě)模板語(yǔ)法

(4)頁(yè)面展示

1.9 請(qǐng)求和響應(yīng)

1.

2. 案例:用戶(hù)登錄

(1)發(fā)生如下錯(cuò)誤,只需要在 form 表單中偽造跨站請(qǐng)求 {% csrf_token %} 。


(2)最終代碼:

(3)效果展示

1.10 orm數(shù)據(jù)庫(kù)操作

ORM

  • 創(chuàng)建、修改、刪除數(shù)據(jù)庫(kù)中的表;(不用寫(xiě)SQL語(yǔ)句)【無(wú)法創(chuàng)建數(shù)據(jù)庫(kù)】
  • 操作表中的數(shù)據(jù)(不用寫(xiě)SQL語(yǔ)句)。

1. 安裝第三方庫(kù)

pip install mysqlclient==1.4.1

2. 創(chuàng)建數(shù)據(jù)庫(kù)

  • 首先在終端啟動(dòng) mysql:
net start mysql
  • 登錄 mysql(已經(jīng)將初始密碼設(shè)為 0 )
mysql -u root -p
  • 創(chuàng)建數(shù)據(jù)庫(kù)(其中 gx 是數(shù)據(jù)庫(kù)名稱(chēng)):
create database gx DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

3. django 連接數(shù)據(jù)庫(kù)

在 settings.py 文件中進(jìn)行配置和修改。

更改默認(rèn) DATABASES :

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 引擎'NAME': 'gx', # 數(shù)據(jù)庫(kù)名字'USER': 'root', # 用戶(hù)名'PASSWORD': '123456', # 密碼'HOST': '127.0.0.1', # 哪臺(tái)機(jī)器安裝了MySQL - 本機(jī)'PORT': '3306',} }

4. django 創(chuàng)建表

(1)在 models.py 文件中:

等同于:

create table app01_userinfo(id bigint auto_increment primary key, # django自動(dòng)添加name varchar(32),password varchar(64),age int )

(2)在 pycharm 終端輸入,注意, app 需要提前注冊(cè):

python manage.py makemigrations python manage.py migrate

至此,表已經(jīng)創(chuàng)建成功。


5. django 修改表

(1) 刪除某個(gè)列:

  • 注釋該列;
  • 在 pycharm 終端輸入:
python manage.py makemigrations python manage.py migrate

(2)添加某個(gè)列:
- 在 python 代碼中輸入該列;
- 在 pycharm 終端輸入:

python manage.py makemigrations python manage.py migrate

(3)但是,對(duì)于 添加列 需要注意,由于已存在的列可能已有數(shù)據(jù),所以新增列必須要指定對(duì)應(yīng)的數(shù)據(jù):

  • 選擇 1,手動(dòng)輸入一個(gè)值;
  • 選擇 2,回到代碼設(shè)置默認(rèn)值;
age = models.IntegerField(default=2)
  • 允許為空;
data = models.IntegerField(null=True, blank=True)

總結(jié):對(duì)表結(jié)構(gòu)進(jìn)行調(diào)整

  • 在 models.py 文件中進(jìn)行操作類(lèi);
  • 輸入命令:
    python manage.py makemigrations
    python manage.py migrate

6. 操作表中的數(shù)據(jù)


1.11 ORM 數(shù)據(jù)庫(kù)案例:用戶(hù)管理

1. 展示用戶(hù)列表

  • url;
  • 函數(shù)
    • 獲取所有用戶(hù)信息;
    • HTML 渲染;


2. 添加用戶(hù)

  • url;
  • 函數(shù)
    • GET,看到頁(yè)面,輸入內(nèi)容;
    • POST,提交,寫(xiě)入到數(shù)據(jù)庫(kù)。

(1)在 urls.py 中添加 path:

(2)編寫(xiě)函數(shù) info_add :

(3)編寫(xiě) info_add.html ,注意要有 {% csrf_token %} ,使得跨站網(wǎng)址請(qǐng)求能夠成功。


(4)效果展示

3. 刪除用戶(hù)

  • url;
  • 函數(shù)

(1)在 urls.py 添加 path:

(2) 在 views.py 中編寫(xiě)相關(guān)代碼:

(3)結(jié)果展示:(當(dāng)然在 /info/list.html 中也做了修改)

2 案例

2.1 創(chuàng)建項(xiàng)目和 APP

  • 在終端進(jìn)入項(xiàng)目的存儲(chǔ)路徑,然后創(chuàng)建項(xiàng)目:

    E:\PycharmProjects>django-admin.exe startproject day16
  • 創(chuàng)建APP:

    E:\PycharmProjects\day16>python manage.py startapp app01
  • 注冊(cè) APP ,修改 setting.py :

    INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config', ]
  • 2.2 表結(jié)構(gòu)的創(chuàng)建

    models.py

    from django.db import models# Create your models here.class Department(models.Model):"""部門(mén)表"""title = models.CharField(verbose_name='標(biāo)題', max_length=32)class UserInfo(models.Model):"""員工表"""name = models.CharField(verbose_name="姓名", max_length=16)password = models.CharField(verbose_name="密碼", max_length=64)age = models.IntegerField(verbose_name="年齡")account = models.DecimalField(verbose_name="賬戶(hù)余額", max_digits=10, decimal_places=2, default=0)create_time = models.DateTimeField(verbose_name="入職時(shí)間")# 1. 有約束# - to,與哪張表關(guān)聯(lián)# - to_field,表中的哪一列關(guān)聯(lián)# 2. django自動(dòng)# - 寫(xiě)的 depart# - 實(shí)際生成 depart_id# 3. 部門(mén)表被刪除# 3.1 級(jí)聯(lián)刪除depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)# 3.2 置空# depart = models.ForeignKey(to="Department", to_field="id", null=True, blank=True, on_delete=models.SET_NULL)gender_choices = ((1, "男"),(2, "女"),)gender = models.SmallIntegerField(verbose_name="性別", choices=gender_choices)

    2.3 生成數(shù)據(jù)庫(kù)

  • cmd 終端創(chuàng)建數(shù)據(jù)庫(kù)
  • create database day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  • 在 setting.py 中修改 DATABASES
  • DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 引擎'NAME': 'day16', # 數(shù)據(jù)庫(kù)名字'USER': 'root', # 用戶(hù)名'PASSWORD': 'root', # 密碼'HOST': '127.0.0.1', # 哪臺(tái)機(jī)器安裝了MySQL - 本機(jī)'PORT': '3306',} }
  • django 命令生成表
  • python manage.py makemigrations python manage.py migrate

    表結(jié)構(gòu)創(chuàng)建成功:

    2.4 部門(mén)管理


    depart_list.html

    {% load static %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"> </head> <body> <nav class="navbar navbar-default"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse"data-target="#bs-example-navbar-collapse-1" aria-expanded="false"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">聯(lián)通用戶(hù)管理系統(tǒng)</a></div><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav"><li><a href="depart/list">部門(mén)管理</a></li><li><a href="#">用戶(hù)管理</a></li></ul><ul class="nav navbar-nav navbar-right"><li><a href="#">登錄</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">rice <span class="caret"></span></a><ul class="dropdown-menu"><li><a href="#">個(gè)人資料</a></li><li><a href="#">用戶(hù)信息</a></li><li><a href="#">注銷(xiāo)</a></li><li role="separator" class="divider"></li><li><a href="#">Separated link</a></li></ul></li></ul></div><!-- /.navbar-collapse --></div><!-- /.container-fluid --> </nav> <div><div class="container"><div style="margin-bottom: 10px"><a class="btn btn-success" href="#">新建部門(mén)</a></div><div class="panel panel-default"><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>部門(mén)列表</div><table class="table table-bordered"><thead><tr><th>ID</th><th>部門(mén)名稱(chēng)</th><th>操作</th></tr></thead><tbody><tr><td>1</td><td>銷(xiāo)售部</td><td><a class="btn btn-primary btn-xs">編輯</a><a class="btn btn-danger btn-xs">刪除</a></td></tr></tbody></table></div></div> </div> </div> <script src="{% static 'jquery/jquery.min.js' %}"></script> <script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script> </body> </html>

    2.5 數(shù)據(jù)庫(kù)數(shù)據(jù)

    views.py

    from django.shortcuts import render from app01 import models # Create your views here.def depart_list(request):"""部門(mén)列表"""# 去數(shù)據(jù)庫(kù)中獲取所有部門(mén)列表# [對(duì)象, 對(duì)象, 對(duì)象]queryset = models.Department.objects.all()return render(request, 'depart_list.html', {'queryset': queryset})

    depart_list.html

    <tbody>{% for obj in queryset %}<tr><td>{{ obj.id }}</td><td>{{ obj.title }}</td><td><a class="btn btn-primary btn-xs">編輯</a><a class="btn btn-danger btn-xs">刪除</a></td></tr>{% endfor %}</tbody>

    2.6 添加部門(mén)頁(yè)面

    views.py

    def depart_add(request):"""添加部門(mén)"""return render(request, 'depart_add.html')

    depart_list.html

    <div style="margin-bottom: 10px"><a class="btn btn-success" href="/depart/add/" >新建部門(mén)</a> </div>

    depart_add.html

    <div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">部門(mén)列表</h3></div><div class="panel-body"><form><div class="form-group"><label>標(biāo)題</label><input type="text" class="form-control" placeholder="標(biāo)題" name="title" /></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="submit" class="btn btn-primary">保 存</button></div></div></form></div></div>

    2.7 部門(mén):添加

    views.py

    # 導(dǎo)入redirect from django.shortcuts import render, redirect def depart_add(request):"""添加部門(mén)"""if request.method == "GET":return render(request, 'depart_add.html')# 獲取用戶(hù)POST提交過(guò)來(lái)的數(shù)據(jù)title = request.POST.get("title")# 保存到數(shù)據(jù)庫(kù)models.Department.objects.create(title=title)# 重定向到部門(mén)列表return redirect('/depart/list')

    depart_add.html

    <div class="panel-body"><form method="post">{% csrf_token %}<div class="form-group"><label>標(biāo)題</label><input type="text" class="form-control" placeholder="標(biāo)題" name="title"/></div><div class="form-group"><button type="submit" class="btn btn-primary">提交</button></div></form>

    2.8 部門(mén):刪除

    views.py

    def depart_delete(request):"""刪除部門(mén)"""# 獲取IDnid = request.GET.get('nid')# 刪除models.Department.objects.filter(id=nid).delete()# 重定向回部門(mén)列表return redirect("/depart/list/")

    depart_list.html

    <a class="btn btn-danger btn-xs" href="/depart/delete/?nid= {{ obj.id }}">刪除</a>

    2.9 部門(mén):編輯

    urls.py

    /< 正則表達(dá)式 >/

    urlpatterns = [# http://127.0.0.1:8000/depart/1/edit/path('depart/<int:nid>/edit/', views.depart_edit), ]

    views.py

    def depart_edit(request, nid):"""修改部門(mén)"""if(request.method == "GET"):# 根據(jù)nid 獲取它的數(shù)據(jù) [object,]row_object = models.Department.objects.filter(id=nid).first()return render(request, 'depart_edit.html', {"title": row_object.title})# 獲取用戶(hù)提交的數(shù)據(jù)title = request.POST.get("title")# 更新數(shù)據(jù)models.Department.objects.filter(id=nid).update(title=title)# 重定向回部門(mén)列表界面return redirect("/depart/list/")

    depart_edit.html

    <input type="text" class="form-control" placeholder="標(biāo)題" name="title" value="{{ title }}"/>

    2.10 模板繼承

  • 定義模板:
  • layout.html

    {% load static %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"> </head> <body> <div>{% block content %}{% endblock%} </div> <script src="{% static 'jquery/jquery.min.js' %}"></script> <script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script> </body> </html>
  • 在別的 html 界面繼承模板:
  • children.html

    {% extends 'layout.html' %}{% block content %}<!--新增內(nèi)容-->{% endblock %}

    當(dāng)然, 也可以定義多個(gè)模板:

    layout.html

    {% load static %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title>{% block css %}{% endblock%} </head> <body> <div>{% block content %}{% endblock%} </div>{% block js %}{% endblock%} </body> </html>

    children.html

    {% extends 'layout.html' %}{% block css %}<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"> {% endblock%}{% block content %} <!--新增內(nèi)容--> {% endblock %}{% block js %}<script src="{% static 'jquery/jquery.min.js' %}"></script> {% endblock%}

    2.11 用戶(hù)管理:列表

  • 在 mysql 插入數(shù)據(jù)insert into app01_userinfo(name, password, age, account, create_time, gender, depart_id) values("rice", "123", 23, 100.68, "2020-01-11", 2, 1);insert into app01_userinfo(name, password, age, account, create_time, gender, depart_id) values("candy", "123", 26, 100.68, "2021-01-11", 1, 2);insert into app01_userinfo(name, password, age, account, create_time, gender, depart_id) values("romance", "123", 25, 100.68, "2020-01-11", 2, 4);
  • urls.py

    path('user/list/', views.user_list),
  • views.py

    def user_list(request):"""用戶(hù)管理"""# 獲取所有用戶(hù)信息queryset = models.UserInfo.objects.all()# python 寫(xiě)法# for obj in queryset:# id = obj.id# name = obj.name# password = obj.password# age = obj.age# account = obj.account# create_time = obj.create_time.strftime("%Y-%m-%d")# gender = obj.get_gender_display()# title = obj.depart.title # 根據(jù)id自動(dòng)去關(guān)聯(lián)的表中獲取哪一行的數(shù)據(jù)depart對(duì)象return render(request, 'user_list.html', {"queryset": queryset})
  • user_list.html
  • <table class="table table-bordered"><thead><tr><th>ID</th><th>姓名</th><th>密碼</th><th>年齡</th><th>余額</th><th>入職時(shí)間</th><th>性別</th><th>所屬部門(mén)</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr><td>{{ obj.id }}</td><td>{{ obj.name }}</td><td>{{ obj.password }}</td><td>{{ obj.age }}</td><td>{{ obj.account }}</td><td>{{ obj.create_time|date:"Y-m-d" }}</td><td>{{ obj.get_gender_display }}</td><td>{{ obj.depart.title }}</td><td><a class="btn btn-primary btn-xs" href="#">編輯</a><a class="btn btn-danger btn-xs" href="#">刪除</a></td></tr>{% endfor %}</tbody> </table>
  • 效果展示

  • 2.12 用戶(hù)管理:添加

    1. 思路

    • 原始方法:比較復(fù)雜,因此最終不采用;

      缺點(diǎn)

      • 用戶(hù)提交數(shù)據(jù)沒(méi)有校驗(yàn);
      • 發(fā)生錯(cuò)誤的時(shí)候,頁(yè)面沒(méi)有錯(cuò)誤提示;
      • 頁(yè)面上,每一個(gè)字段都需要我們重新寫(xiě)一遍;
      • 關(guān)聯(lián)數(shù)據(jù)需要手動(dòng)獲取并通過(guò)循環(huán)才能展示在頁(yè)面。
    • Django 組件

      • Form 組件 【簡(jiǎn)便】
      • ModelForm 組件 【最簡(jiǎn)便】【最推薦】

    2. 原始方法

  • views.py

    def user_add(request):"""添加用戶(hù)"""if request.method == "GET":context = {'gender_choices': models.UserInfo.gender_choices,'depart_list': models.Department.objects.all()}return render(request, 'user_add.html', context)# 獲取用戶(hù)提交的數(shù)據(jù)user = request.POST.get('user')pwd = request.POST.get('pwd')age = request.POST.get('age')account = request.POST.get('ac')ctime = request.POST.get('ctime')gender = request.POST.get('gd')depart_id = request.POST.get('dp')# 添加到數(shù)據(jù)庫(kù)中models.UserInfo.objects.create(name=user, password=pwd, age=age,account=account, create_time=ctime,gender=gender, depart_id=depart_id)# 返回到用戶(hù)列表界面return redirect("/user/list")
  • user_add.html

    <div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">用戶(hù)列表</h3></div><div class="panel-body"><form method="post">{% csrf_token %}<div class="form-group"><label>姓名</label><input type="text" class="form-control" placeholder="姓名" name="user"/></div><div class="form-group"><label>密碼</label><input type="text" class="form-control" placeholder="密碼" name="pwd"/></div><div class="form-group"><label>年齡</label><input type="text" class="form-control" placeholder="年齡" name="age"/></div><div class="form-group"><label>余額</label><input type="text" class="form-control" placeholder="余額" name="ac"/></div><div class="form-group"><label>入職時(shí)間</label><input type="text" class="form-control" placeholder="入職時(shí)間" name="ctime"/></div><div class="form-group"><label>性別</label><select class="form-control" name="gd">{% for gender in gender_choices %}<option value="{{ gender.0 }}">{{ gender.1 }}</option>{% endfor %}</select></div><div class="form-group"><label>部門(mén)</label><select class="form-control" name="dp">{% for item in depart_list %}<option value="{{ item.id }}">{{ item.title }}</option>{% endfor %}</select></div><div class="form-group"><button type="submit" class="btn btn-primary">提交</button></div></form></div></div> </div>
  • 3.Form

  • views.py

    class MyForm(Form):user = forms.CharField(wiget=forms.Input)pwd = form.CharField(wiget=forms.Input)age= form.CharField(wiget=forms.Input)account = form.CharField(wiget=forms.Input)create_time = form.CharField(wiget=forms.Input)gender = form.CharField(wiget=forms.Input)depart_id = form.CharField(wiget=forms.Input)def user_add(request):form = MyForm() # 實(shí)例化return render(request, 'user_add.html', {"form": form})
  • user_add.html

    form.user 相當(dāng)于 input user

    <form method="post">{{ form.user }}{{ form.pwd }} <!--<input type="text" class="form-control" placeholder="姓名" name="user"/>--></form>

    進(jìn)一步優(yōu)化,使用循環(huán):

    <form method="post">{ for field in form %}{{ field }}{% endfor %} </form>
  • 4. ModelForm

  • models.py

    class UserInfo(models.Model):"""員工表"""name = models.CharField(verbose_name="姓名", max_length=16)password = models.CharField(verbose_name="密碼", max_length=64)age = models.IntegerField(verbose_name="年齡")account = models.DecimalField(verbose_name="賬戶(hù)余額", max_digits=10, decimal_places=2, default=0)create_time = models.DateTimeField(verbose_name="入職時(shí)間")depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE)gender_choices = ((1, "男"),(2, "女"),)gender = models.SmallIntegerField(verbose_name="性別", choices=gender_choices)
  • views.py

    class MyForm(ModelForm):class Meta:model = UserInfofields = ["name", "password", "age"] def user_add(request):form = MyForm() # 實(shí)例化return render(request, 'user_add.html', {"form": form})
  • user_add.html

    form.user 相當(dāng)于 input user

    <form method="post">{{ form.user }}{{ form.pwd }} <!--<input type="text" class="form-control" placeholder="姓名" name="user"/>--></form>

    進(jìn)一步優(yōu)化,使用循環(huán):

    <form method="post">{ for field in form %}{{ field }}{% endfor %} </form>
  • 5. 使用 ModelForm 添加用戶(hù)

  • views.py

    from django import formsclass UserModelForm(forms.ModelForm):class Meta:model = models.UserInfofields = ["name", "password", "age", "account", "create_time", "depart", "gender"]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循環(huán)找到所有插件,添加class="form-control"for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "placeholder": field.label}def user_model_form_add(request):"""添加用戶(hù) ModelForm版本"""form = UserModelForm()return render(request, 'user_model_form_add.html', {"form": form})
  • models.py

    重寫(xiě)字段,保證 depart 作為用戶(hù)列表的外鍵能夠以字符形式顯示。

    class Department(models.Model):"""部門(mén)表"""title = models.CharField(verbose_name='標(biāo)題', max_length=32)def __str__(self):return self.title
  • user_model_form_add.html

    {% extends 'layout.html' %}{% block content %} <div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">用戶(hù)列表</h3></div><div class="panel-body"><form method="post">{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}</div>{% endfor %}<div class="form-group"><button type="submit" class="btn btn-primary">提交</button></div></form></div></div> </div> {% endblock %}
  • 效果圖

  • 6. 添加的錯(cuò)誤提示

  • views.py

    重寫(xiě)字段 name ,用于數(shù)據(jù)驗(yàn)證(name 字段至少為 3 個(gè)字符),
    name = forms.CharField(min_length=3, label="用戶(hù)名"):

    class UserModelForm(forms.ModelForm):# 重寫(xiě)字段name = forms.CharField(min_length=3, label="用戶(hù)名")class Meta:model = models.UserInfofields = ["name", "password", "age", "account", "create_time", "depart", "gender"]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循環(huán)找到所有插件,添加class="form-control"for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "placeholder": field.label} def user_model_form_add(request):"""添加用戶(hù) ModelForm版本"""if request.method == "GET":form = UserModelForm()return render(request, 'user_model_form_add.html', {"form": form})# 用戶(hù)POST提交數(shù)據(jù),數(shù)據(jù)校驗(yàn)form = UserModelForm(data=request.POST)if form.is_valid():# 如果數(shù)據(jù)合法,保存在數(shù)據(jù)庫(kù)form.save()return redirect('/user/list/')# 校驗(yàn)失敗(在頁(yè)面上顯示錯(cuò)誤信息)else:return render(request, 'user_model_form_add.html', {"form": form})
  • user_model_form_add.html

    注意,網(wǎng)頁(yè)自帶的驗(yàn)證先取消 novalidate ,方便展示我們代碼實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的效果。
    field.errors.0 顯示當(dāng)前的第一個(gè)錯(cuò)誤。

    <form method="post" , novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span></div>{% endfor %}<div class="form-group"><button type="submit" class="btn btn-primary">提交</button></div> </form>
  • 效果圖:

  • 2.13 用戶(hù)管理:編輯

    • 點(diǎn)擊編輯, 跳轉(zhuǎn)到編輯界面(將編輯行的 ID 攜帶過(guò)去);
    • 編輯頁(yè)面(默認(rèn)數(shù)據(jù),根據(jù)ID獲取并設(shè)置到頁(yè)面中)
    • 提交
      • 錯(cuò)誤提示
      • 數(shù)據(jù)校驗(yàn)
      • 數(shù)據(jù)庫(kù)更新
  • user_list.html

    <a class="btn btn-primary btn-xs" href="/user/{{ obj.id }}/edit/">編輯</a>
  • urls.py
    編輯用戶(hù)需要獲取用戶(hù)的id

    path('user/<int:nid>/edit/', views.user_edit),
  • views.py

    def user_edit(request, nid):"""編輯用戶(hù)"""# 根據(jù)id去數(shù)據(jù)庫(kù)獲取編輯行的數(shù)據(jù)row_object = models.UserInfo.objects.filter(id=nid).first()if request.method == "GET":# 加入instance參數(shù),原有的值會(huì)顯示在輸入框form = UserModelForm(instance=row_object)return render(request, 'user_edit.html', {'form': form})form = UserModelForm(data=request.POST, instance=row_object)if form.is_valid():form.save()return redirect('/user/list/')return render(request, 'user_edit.html', {"form":form})
  • 效果圖

  • 2.14 用戶(hù)管理:刪除

  • user_list.html

    修改刪除標(biāo)簽

    <a class="btn btn-danger btn-xs" href="/user/{{ obj.id }}/delete/">刪除</a>
  • urls.py

    path('user/<int:nid>/delete/', views.user_delete)
  • views.py

    def user_delete(request, nid):models.UserInfo.objects.filter(id=nid).delete()return redirect('/user/list/')
  • 3 案例:靚號(hào)管理

    3.1 表結(jié)構(gòu)

    class PrettyNum(models.Model):"""靚號(hào)表"""mobile = models.CharField(verbose_name="手機(jī)號(hào)", max_length=11)# 想要允許為空 null=True, blank=Trueprice = models.IntegerField(verbose_name="價(jià)格", default=0)level_choices = ((1, "1級(jí)"),(2, "2級(jí)"),(3, "3級(jí)"),(4, "4級(jí)"),)level = models.SmallIntegerField(verbose_name="級(jí)別", choices=level_choices, default=1)status_choices = ((1, "已占用"),(2, "未使用"),)status = models.SmallIntegerField(verbose_name="狀態(tài)", choices=status_choices, default=2)

    3.2 靚號(hào)列表

    • URL;
    • 函數(shù)
      • 獲取所有靚號(hào);
      • 結(jié)合 html + render 將所有靚號(hào)展現(xiàn)出來(lái);
  • layout.html

    <li><a href="/pretty/list/">靚號(hào)管理</a></li>
  • urls.py

    path('pretty/list/', views.pretty_list),
  • views.py

    def pretty_list(request):"""靚號(hào)管理"""# order_by :降序queryset = models.PrettyNum.objects.all().order_by("-level")return render(request, 'pretty_list.html', {'queryset': queryset})
  • pretty.html

    {% extends 'layout.html' %} {% block content %}<div class="container"><div style="margin-bottom: 10px"><a class="btn btn-success" href="#">新建靚號(hào)</a></div><div class="panel panel-default"><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>用戶(hù)列表</div><table class="table table-bordered"><thead><tr><th>ID</th><th>手機(jī)號(hào)</th><th>價(jià)格</th><th>級(jí)別</th><th>狀態(tài)</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr><td>{{ obj.id }}</td><td>{{ obj.mobile }}</td><td>{{ obj.price }}</td><td>{{ obj.get_level_display }}</td><td>{{ obj.get_status_display }}</td><td><a class="btn btn-primary btn-xs" href="#">編輯</a><a class="btn btn-danger btn-xs" href="#">刪除</a></td></tr>{% endfor %}</tbody></table></div></div> {% endblock %}
  • 3.3 新建靚號(hào)

    • 列表點(diǎn)擊跳轉(zhuǎn):/pretty/add/
    • URL
    • ModelForm 類(lèi)
    • 函數(shù)
      • 實(shí)例化類(lèi)對(duì)象;
      • 通過(guò) render 將對(duì)象傳入到 HTML 中;
      • 模板循環(huán)展示所有對(duì)象;
    • 點(diǎn)擊提交
      • 數(shù)據(jù)校驗(yàn); 【兩種方法】
      • 保存到數(shù)據(jù)庫(kù);
      • 跳轉(zhuǎn)回靚號(hào)列表;
  • urls.py

    path('pretty/add/', views.pretty_add),
  • views.py

    from django.core.validators import RegexValidator from django.core.validators import ValidationError class PrettyModelForm(forms.ModelForm):# 驗(yàn)證:方式1 字段+正則# mobile = forms.CharField(# label="手機(jī)號(hào)",# validators=[RegexValidator(r'^1[3-9]\d{9}$', '手機(jī)號(hào)格式錯(cuò)誤')],# )class Meta:model = models.PrettyNum# fields = ["mobile", "price", "level", "status"]fields = "__all__"# exclude = ['level']def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "placeholder": field.label}# 驗(yàn)證:方式2 鉤子方法 def clean_mobile(self):txt_mobile = self.cleaned_data['mobile']if len(txt_mobile) != 11:# 驗(yàn)證不通過(guò)raise ValidationError("格式錯(cuò)誤")# 驗(yàn)證通過(guò)return txt_mobile def pretty_add(request):"""添加靚號(hào)"""if request.method == "GET":form = PrettyModelForm()return render(request, 'pretty_add.html', {'form': form})# POST提交數(shù)據(jù),數(shù)據(jù)校驗(yàn)form = PrettyModelForm(data=request.POST)if form.is_valid():form.save()return redirect('/pretty/list/')# 校驗(yàn)失敗else:return render(request, 'pretty_add.html', {'form': form})
  • pretty_list.html

    <a class="btn btn-success" href="/pretty/add/">新建靚號(hào)</a>
  • pretty_add.html

  • {% extends 'layout.html' %} {% block content %} <div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">靚號(hào)列表</h3></div><div class="panel-body"><form method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span></div>{% endfor %}<div class="form-group"><button type="submit" class="btn btn-primary">提交</button></div></form></div></div> </div>{% endblock%}
  • 效果圖

  • 數(shù)據(jù)校驗(yàn)的補(bǔ)充:數(shù)據(jù)庫(kù)的手機(jī)號(hào)需要唯一

    使用正則表達(dá)式判斷 「手機(jī)號(hào)是否已經(jīng)存在」

    # True/False exists = models.PrettyNum.objects.ilter(mobile="100000000").exists()

    效果圖:


    views.py

    class PrettyModelForm(forms.ModelForm):class Meta:model = models.PrettyNumfields = "__all__"def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "placeholder": field.label}# 驗(yàn)證:方式2def clean_mobile(self):txt_mobile = self.cleaned_data['mobile']# 手機(jī)號(hào)是否唯一的判斷 exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()if exists:raise ValidationError("手機(jī)號(hào)已存在")return txt_mobile
  • 3.4 編輯靚號(hào)

  • urls.py

    path('pretty/<int:nid>/edit/', views.pretty_edit),
  • views.py

    class PrettyEditModeleForm(forms.ModelForm):# disabled參數(shù),該字段不可以編輯# mobile = forms.CharField(disabled=True, label="手機(jī)號(hào)")class Meta:model = models.PrettyNum#fields = ["price", "level", "status"]fields = "__all__"def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "placeholder": field.label}# 驗(yàn)證:方式2def clean_mobile(self):# 當(dāng)前編輯行的id# self.instance.pktxt_mobile = self.cleaned_data['mobile']# 手機(jī)號(hào)是否唯一的判斷exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()if exists:raise ValidationError("手機(jī)號(hào)已存在")if len(txt_mobile) != 11:# 驗(yàn)證不通過(guò)raise ValidationError("格式錯(cuò)誤")# 驗(yàn)證通過(guò)return txt_mobile def pretty_edit(request, nid):"""編輯靚號(hào)"""# 根據(jù)id去數(shù)據(jù)庫(kù)獲取編輯行的數(shù)據(jù)row_object = models.PrettyNum.objects.filter(id=nid).first()if request.method == "GET":form = PrettyEditModeleForm(instance=row_object)return render(request, 'pretty_edit.html', {'form': form})form = PrettyEditModeleForm(data=request.POST, instance=row_object)if form.is_valid():form.save()return redirect('/pretty/list/')return render(request, 'pretty_edit.html', {'form': form})
  • pretty_list.html

    <a class="btn btn-primary btn-xs" href="/pretty/{{ obj.id }}/edit/">編輯</a>
  • pretty_edit.html

    {% extends 'layout.html' %} {% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title">編輯靚號(hào)</h3></div><div class="panel-body"><form method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span></div>{% endfor %}<div class="form-group"><button type="submit" class="btn btn-primary">提交</button></div></form></div></div> </div>{% endblock %}
  • 效果圖

  • 數(shù)據(jù)校驗(yàn):確保手機(jī)號(hào)的唯一性。

    這和新建靚號(hào)中的校驗(yàn)不太一樣。新建靚號(hào)的時(shí)候,對(duì)于新輸入的手機(jī)號(hào),是和數(shù)據(jù)庫(kù)中的手機(jī)號(hào)相比判斷的。

    編輯靚號(hào)中,如果你更改的是手機(jī)號(hào)除外的信息,此時(shí)也沒(méi)辦法通過(guò),因?yàn)槟憔庉嫼筇峤坏氖謾C(jī)號(hào)在數(shù)據(jù)庫(kù)中已經(jīng)存在了,因此在進(jìn)行校驗(yàn)的時(shí)候需要排除自身的手機(jī)號(hào)再判斷唯一性。

    views.py

    txt_mobile = self.cleaned_data['mobile']# 當(dāng)前編輯行的id # self.instance.pk exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()if exists:raise ValidationError("手機(jī)號(hào)已存在")

    效果圖,編輯當(dāng)前手機(jī)號(hào)的級(jí)別:

  • 3.5 刪除靚號(hào)

  • pretty_list.html

    修改刪除標(biāo)簽

    <a class="btn btn-danger btn-xs" href="/pretty/{{ obj.id }}/delete/">刪除</a>
  • urls.py

    path('pretty/<int:nid>/delete/', views.pretty_delete),
  • views.py

    def pretty_delete(request, nid):models.PrettyNum.objects.filter(id=nid).delete()return redirect('/pretty/list/')
  • 3.6 靚號(hào)管理:手機(jī)號(hào)搜索

  • 數(shù)據(jù)庫(kù)搜索相關(guān)知識(shí)補(bǔ)充

    models.PrettyNum.objects.filter(mobile="12345678920", id=5)# 以字典方式傳入 必須要加 ** data_list = {"mobile": "12345678920", "id": 5} models.PrettyNum.objects.filter(**data_list) models.PrettyNum.objects.filter(id=5) # 等于5 models.PrettyNum.objects.filter(id__gt=5) # 大于5 models.PrettyNum.objects.filter(id__gte=5) # 大于等于5 models.PrettyNum.objects.filter(id__lt=5) # 小于5 models.PrettyNum.objects.filter(id__lte=5) # 小于等于5 models.PrettyNum.objects.filter(mobile="123") # 等于 models.PrettyNum.objects.filter(mobile__startswith="123") # 以123開(kāi)頭 models.PrettyNum.objects.filter(mobile__endswith="123") # 以123結(jié)尾 models.PrettyNum.objects.filter(mobile__contains="123") # 包含123
  • 手機(jī)號(hào)搜索實(shí)現(xiàn)

    本質(zhì):

    在用戶(hù)列表界面增加一個(gè)輸入框,用來(lái)輸入查詢(xún)的手機(jī)號(hào)。

    我們希望進(jìn)行搜索時(shí),條件會(huì)包含在網(wǎng)址里,即網(wǎng)址是 http://127.0.0.1:8000/pretty/list/?q=456 ,那么需要通過(guò) get 方式提交,即 <form method="get"> 。那么后端會(huì)通過(guò) request.GET.get 獲取到 name="q" 的輸入,將其放入字典 data_list ,作為數(shù)據(jù)庫(kù)搜索的條件 filter(**data_list) 。

    要想讓輸入框能夠顯示查詢(xún)的手機(jī)號(hào),需要把輸入值 search_data 傳入前端,放在<input> 標(biāo)簽的 value 字段。

  • views.py

    def pretty_list(request):"""靚號(hào)管理"""data_list = {}search_data = request.GET.get('q', "")if search_data:data_list["mobile__contains"] = search_dataqueryset = models.PrettyNum.objects.filter(**data_list).order_by("-level")return render(request, 'pretty_list.html', {'queryset': queryset, "search_data": search_data})

    pretty_list.html

    <div style="margin-bottom: 10px" class="clearfix"><a class="btn btn-success" href="/pretty/add/">新建靚號(hào)</a><div style="float: right; width:300px"><form method="get"><div class="input-group"><input type="text" name="q" class="form-control" placeholder="Search for..."value="{{ search_data }}"><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></button></span></div><!-- /input-group --></form></div></div>

    效果圖:

    3.7 靚號(hào)管理:分頁(yè)

  • pagination.py

    """ 自定義分頁(yè)組件 如果以后想要使用這個(gè)分頁(yè)組件,需要做如下幾件事:在視圖函數(shù)中:def pretty_list(request):# 1. 根據(jù)自己的情況去篩選數(shù)據(jù)queryset = models.PrettyNum.objects.filter(**data_list).order_by("-level")# 2. 實(shí)例化分頁(yè)對(duì)象page_objects = Pagination(request, queryset) # 封裝成組件context = {'search_data': search_data,'queryset': page_objects.page_queryset, # 分完頁(yè)的數(shù)據(jù)"page_string": page_objects.html() # 生成的頁(yè)碼}return render(request, 'pretty_list.html', context)# 在HTML中:{% for obj in queryset %}{{ obj.xx }}{% endfor %}<ul class="pagination">{{ page_string }}</ul> """ from django.utils.safestring import mark_safeclass Pagination(object):def __init__(self, request, queryset, page_size=10, page_param="page", plus=5):""":param request: 請(qǐng)求的對(duì)象:param queryset: 符合條件的數(shù)據(jù) (根據(jù)這個(gè)數(shù)據(jù)給他進(jìn)行分頁(yè)處理):param page_size: 每頁(yè)顯示多少條數(shù)據(jù):param page_param: 在URL中傳遞的獲取分頁(yè)的參數(shù) 例如:pretty/list/?page=1:param plus: 顯示當(dāng)前頁(yè)的前后幾頁(yè)(頁(yè)碼)"""import copyquery_dict = copy.deepcopy(request.GET)query_dict.mutable = Trueself.query_dict = query_dictself.page_param = page_parampage = int(request.GET.get(page_param, "1"))self.page = pageself.page_size = page_sizeself.start = (page - 1) * page_sizeself.end = page * page_sizeself.page_queryset = queryset[self.start:self.end]total_count = queryset.count()# 總頁(yè)碼數(shù)total_page_count, div = divmod(total_count, page_size)if div:total_page_count += 1self.total_page_count = total_page_countself.plus = plusdef html(self):# 計(jì)算當(dāng)前頁(yè)的前5頁(yè)與后5頁(yè)if self.total_page_count <= 2 * self.plus + 1:start_page = 1end_page = self.total_page_count + 1else:if self.page <= self.plus:start_page = 1end_page = 2 * self.plus + 1else:if (self.page + self.plus) > self.total_page_count:start_page = self.total_page_count - 2 * self.plusend_page = self.total_page_countelse:start_page = self.page - self.plusend_page = self.page + self.pluspage_str_list = []# 首頁(yè)self.query_dict.setlist(self.page_param, [1])page_str_list.append('<li><a href="?{}">首頁(yè)</a></li>'.format(self.query_dict.urlencode()))# 上一頁(yè)if self.page > 1:self.query_dict.setlist(self.page_param, [self.page - 1])prev = '<li><a href="?{}">上一頁(yè)</a></li>'.format(self.query_dict.urlencode())else:self.query_dict.setlist(self.page_param, [1])prev = '<li><a href="?{}">上一頁(yè)</a></li>'.format(self.query_dict.urlencode())page_str_list.append(prev)# 生成頁(yè)碼for i in range(start_page, end_page):self.query_dict.setlist(self.page_param, [i])if i == self.page:ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)else:ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)page_str_list.append(ele)# 下一頁(yè)if self.page < self.total_page_count:self.query_dict.setlist(self.page_param, [self.page + 1])prev = '<li><a href="?{}">下一頁(yè)</a></li>'.format(self.query_dict.urlencode())else:self.query_dict.setlist(self.page_param, [self.total_page_count])prev = '<li><a href="?{}">下一頁(yè)</a></li>'.format(self.query_dict.urlencode())page_str_list.append(prev)# 尾頁(yè)self.query_dict.setlist(self.page_param, [self.total_page_count])page_str_list.append('<li><a href="?{}">尾頁(yè)</a></li>'.format(self.query_dict.urlencode()))page_string = mark_safe("".join(page_str_list))return page_string
  • views.py

    from app01.utils.pagination import Paginationdef pretty_list(request):"""靚號(hào)管理"""data_list = {}search_data = request.GET.get('q', "")if search_data:data_list["mobile__contains"] = search_dataqueryset = models.PrettyNum.objects.filter(**data_list).order_by("-level")page_objects = Pagination(request, queryset) # 封裝成組件context = {'search_data': search_data,'queryset': page_objects.page_queryset, # 分完頁(yè)的數(shù)據(jù)"page_string": page_objects.html() # 生成的頁(yè)碼}return render(request, 'pretty_list.html', context)
  • pretty_list.html

    <div class="clearfix"><ul class="pagination">{{page_string}}<li><form method="get"><div class="input-group" style="width: 200px"><input type="text" name="page" class="form-control" placeholder="頁(yè)碼"><span class="input-group-btn"><button class="btn btn-default" type="submit">跳轉(zhuǎn)</button></span></div></form></li></ul></div>
  • 視頻3-10還有一半未看。

    4 時(shí)間選擇組件

  • 效果展示:
  • ![在這里插入圖片描述](https://img-blog.csdnimg.cn/38585175e498498b90b21bbcc6371528.png)
  • 引入 bootstrap-datepicker

    {% block css %}<link rel="stylesheet" href="{% static '/plugins/bootstrap-datepicker-master/dist/css/bootstrap-datepicker.min.css' %}"> {% endblock %} {% block js %}<script src="{% static '/plugins/bootstrap-datepicker-master/dist/js/bootstrap-datepicker.min.js' %}"></script><script src="{% static '/plugins/bootstrap-datepicker-master/dist/locales/bootstrap-datepicker.zh-CN.min.js' %}"></script> {% endblock %}
  • user_add.html 時(shí)間函數(shù) ,其中 #dt 對(duì)應(yīng)入職時(shí)間的ID

    <input type="text" id="dt" class="form-control" placeholder="入職時(shí)間" name="ctime"/> <script>$(function() {$('#dt').datepicker({format: 'yyyy-mm-dd',startDate: '0',language: "zh-CN",autoclose: true})})</script>
  • user_model_form_add.html 時(shí)間函數(shù) ,modelform中的ID默認(rèn)為 ID_字段名,即 #id_create_time

    <script>$(function() {$('#id_create_time').datepicker({format: 'yyyy-mm-dd',startDate: '0',language: "zh-CN",autoclose: true})})</script>
  • 5 BootStrap 樣式父類(lèi)

  • 重復(fù)的內(nèi)容可以集成為父類(lèi), 比如樣式設(shè)置:

    from django import formsclass BootStrapModelForm(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循環(huán)找到所有插件,添加class="form-control"for name, field in self.fields.items():# 字段中有屬性,保留原有屬性,沒(méi)有屬性,才增加if field.widget.attrs:field.widget.attrs["class"] = "form-control"field.widget.attrs["placeholder"] = field.labelelse:field.widget.attrs = {"class": "form-control","placeholder": field.label}
  • 之后,所有涉及到樣式設(shè)置的 ModelForm 可以直接繼承 BootStrap ,比如:

    class UserModelForm(BootStrapModelForm):
  • 6 views 函數(shù)拆分

    由于已經(jīng)實(shí)現(xiàn)了許多功能,原本的 views 函數(shù)顯得復(fù)雜,此時(shí)可以新建一個(gè) views 目錄,將各個(gè)功能拆分成若干個(gè) .py 文件。

    注意,原本的 views.py 需要?jiǎng)h除。

    urls.py 也需要修改。

    注意, models.py 函數(shù)不能像這樣拆分。

    7 案例:管理員

    7.1


    參考資料:

  • Windows安裝mysql詳細(xì)步驟(通俗易懂,簡(jiǎn)單上手)
  • 總結(jié)

    以上是生活随笔為你收集整理的【前端开发学习】7.Django的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    久久66热这里只有精品 | 国产美女网站视频 | 久久九九精品 | 久久人人精 | 九九热免费视频在线观看 | 日韩中文字幕在线观看 | 欧美色综合天天久久综合精品 | 深爱激情久久 | 国产精品av在线 | 97国产大学生情侣酒店的特点 | 国产精品一区二区电影 | 亚洲国产丝袜在线观看 | 久久开心激情 | 欧美不卡视频在线 | 人人爱天天操 | 丁香六月伊人 | 国内亚洲精品 | 黄色午夜网站 | 96久久久| 在线电影 一区 | 欧美成年人在线观看 | 婷婷综合激情 | 亚洲精品在线观看中文字幕 | 91精品小视频 | 久久免费播放视频 | 久久人人爽人人片 | 日韩欧美精品一区二区三区经典 | 亚洲人成人在线 | 99精品成人 | av片一区二区 | 欧美一二三区在线观看 | 色www.| 国产精品美女视频 | 全黄网站| 国产亚洲91 | 亚洲无吗av | 久久免费精彩视频 | 91精品在线观看入口 | 日韩理论在线观看 | 伊人永久在线 | 欧美日韩99 | 人人爱爱 | 3d黄动漫免费看 | 日韩色在线观看 | 国产精品3 | 亚洲成a人片在线www | av黄色免费网站 | av免费福利 | 麻豆首页| 狠狠干天天 | 黄p在线播放 | 手机看片午夜 | 国产午夜三级一二三区 | 91桃色免费视频 | 日韩精品一区二区三区外面 | 成年人app网址 | 丁香婷婷激情网 | 中文字幕乱视频 | 欧洲一区二区三区精品 | 天天草av| 亚洲精品小视频 | 亚洲精品乱码久久久久久久久久 | 中文电影网 | 成人在线免费观看网站 | 国产成人精品一区二区三区网站观看 | 国内精品在线观看视频 | av成人免费在线观看 | 成年人黄色免费视频 | 免费日韩一区二区三区 | 在线观看国产一区二区 | 久久国产福利 | 色综合天天在线 | 午夜免费久久看 | 人人干干人人 | 成人午夜精品福利免费 | 免费亚洲视频在线观看 | 黄色在线观看www | 久久a久久 | 2019天天干夜夜操 | 在线观看久草 | 又黄又刺激视频 | 91禁看片 | 久久av福利 | 中文字幕日韩在线播放 | 久久97超碰 | 久操视频在线播放 | 国产裸体bbb视频 | 婷婷亚洲五月色综合 | 蜜臀一区二区三区精品免费视频 | 久草在线观看视频免费 | 久久精品中文字幕一区二区三区 | 97在线视频网站 | 玖玖视频在线 | 久久曰视频| 国产一区视频在线播放 | 婷婷av资源| 久久涩涩网站 | 免费看的黄色网 | 久久久久久久久久亚洲精品 | 国产91国语对白在线 | 国产精品成人一区二区 | 久草国产在线观看 | 超级碰碰碰碰 | 精品成人a区在线观看 | 色婷婷久久久 | 丝袜美腿在线 | 日韩免费观看一区二区三区 | 97影视 | 日日爽天天操 | 精品国产成人在线影院 | 日日夜夜天天综合 | 亚洲一级电影视频 | 国产在线999 | 丁香六月久久综合狠狠色 | 亚洲精品大全 | 色婷婷狠狠五月综合天色拍 | 国产女做a爱免费视频 | 99精品国产福利在线观看免费 | 91精品看片| 又黄又爽的免费高潮视频 | 久久久综合电影 | 一区二区亚洲精品 | 亚洲欧美激情精品一区二区 | av天天在线观看 | 精品国产一区二区三区四区在线观看 | 又黄又爽又刺激的视频 | 91喷水 | 91视频链接 | 狠狠狠狠狠狠狠 | 免费观看午夜视频 | av中文字幕亚洲 | 国产精品激情在线观看 | 8090yy亚洲精品久久 | 免费看在线看www777 | 亚洲欧洲久久久 | 97视频在线免费观看 | 97日日 | 欧美日韩一区二区免费在线观看 | 九九爱免费视频 | 在线视频 成人 | 国产精品区二区三区日本 | 人人揉人人揉人人揉人人揉97 | 一本—道久久a久久精品蜜桃 | 色婷婷婷| 欧美日韩一区二区视频在线观看 | 国产亚洲精品久久19p | 日韩成人一级大片 | 久久久久9999亚洲精品 | 日韩在线观看免费 | 国产成人高清av | 久久99精品久久久久婷婷 | 欧美少妇的秘密 | 91成人免费电影 | 精品在线视频一区二区三区 | 在线欧美a | 中文字幕电影一区 | 亚洲成人动漫在线观看 | 色视频网页 | 亚洲精品中文字幕在线观看 | 国产自在线观看 | 精品久久久国产 | 激情五月综合 | 成片视频免费观看 | 992tv又爽又黄的免费视频 | 中文字幕在线成人 | 五月激情婷婷丁香 | 操操日日 | 国产一二区免费视频 | 超碰成人免费电影 | 99久久日韩精品免费热麻豆美女 | 亚洲视频www | 国产精品一区二区三区在线免费观看 | 香蕉一区 | 国产一区不卡在线 | www.午夜视频 | 亚洲免费观看视频 | 精品中文字幕在线播放 | 91亚洲国产| 九九热视频在线播放 | 国产一级电影 | 操久 | 91精品啪在线观看国产 | av免费在线播放 | 亚洲一区二区视频在线 | 天天干一干| 久久一线| 日韩午夜精品 | 黄色在线网站噜噜噜 | 精品女同一区二区三区在线观看 | 亚洲精品mv在线观看 | 久久一区二区免费视频 | 午夜成人免费影院 | 亚洲精品一区中文字幕乱码 | 成人黄色中文字幕 | 精品国产一区二区在线 | 亚洲精品国 | 99热这里只有精品1 av中文字幕日韩 | 国产在线毛片 | 91一区啪爱嗯打偷拍欧美 | 在线一区二区三区 | 色欲综合视频天天天 | 国产精品一区二区久久精品爱涩 | 亚洲一区网 | 亚洲精品久久久久58 | 精品国产精品国产偷麻豆 | 美女福利视频一区二区 | 午夜91在线| 欧美精品三级在线观看 | 亚洲精品视频在 | 久久国内免费视频 | 亚洲欧美日韩国产一区二区 | 亚洲区色 | 九九热精品视频在线播放 | 91九色精品女同系列 | 免费看十八岁美女 | 丁香婷婷综合激情五月色 | 欧美一区,二区 | 成人久久久精品国产乱码一区二区 | 欧美日韩国产在线一区 | 天天射综合网视频 | av色一区 | 国产成人福利 | 黄色tv视频 | 成年人免费观看在线视频 | 久久久亚洲电影 | 日日夜夜精品视频 | 亚洲一级电影 | 久久久久久久久久久成人 | 波多野结衣一区 | 色婷婷久久一区二区 | 久久婷婷精品视频 | 国产91学生粉嫩喷水 | 欧美性脚交| 91精品久久久久久粉嫩 | 97在线看片 | 2022中文字幕在线观看 | 国产中文字幕一区 | 五月婷婷中文网 | 在线观看视频福利 | 婷婷久久综合网 | 国产精品第72页 | 久久成年人 | 国内精品久久久 | 99久久久久久久久 | 久久久精品日本 | 91成人精品一区在线播放69 | 亚洲欧洲精品久久 | 黄色av成人在线观看 | 91av视屏| 就色干综合| 人人看人人做人人澡 | 日韩精品一区二区三区免费观看 | 最新中文字幕视频 | 国产精品久久久久久久99 | 超碰在线色 | 久一久久 | 国产福利在线 | 精品视频中文字幕 | 午夜视频在线瓜伦 | 中文字幕在线观看国产 | 国产这里只有精品 | 久草免费在线视频 | 久久99国产精品久久99 | 久久这里只有精品23 | 国产va在线 | 免费成人短视频 | 色天天久久 | 成人午夜性影院 | 久久久精品免费观看 | 国产成人专区 | 国产成人一区二区三区电影 | 97视频人人澡人人爽 | 国产精品精品国产色婷婷 | 三级黄色免费 | 奇米影视8888在线观看大全免费 | 国产精品九九久久99视频 | 国产一区精品在线 | 久久国产精品小视频 | 少妇精品久久久一区二区免费 | 国产老太婆免费交性大片 | 中文字幕在线视频免费播放 | 国语精品久久 | 91精品电影 | 激情 一区二区 | 国产一线二线三线性视频 | 亚洲国产中文字幕在线观看 | 波多野结衣在线视频一区 | 在线国产精品一区 | 精品自拍sae8—视频 | а天堂中文最新一区二区三区 | 麻花豆传媒mv在线观看 | 激情偷乱人伦小说视频在线观看 | 午夜精品999 | 久久久精品午夜 | av免费电影在线观看 | 国产精品久久久久一区二区 | 2021国产精品 | 国产成人福利在线 | 免费看片日韩 | 亚洲 综合 专区 | a久久久久久 | 国产第一页精品 | 在线免费观看国产黄色 | 悠悠av资源片 | 久久美女高清视频 | 又色又爽的网站 | 成人a视频 | 亚洲精品视频在线观看视频 | 国产精品网红福利 | 国产精品亚洲片在线播放 | 九草在线视频 | 久久人人爽爽人人爽人人片av | 久久综合九色综合久久久精品综合 | 日色在线视频 | 亚洲国产999 | 91黄站| 美女网站视频久久 | 婷婷五天天在线视频 | 国产美女在线观看 | 在线三级av| 免费看成人av | 欧美在线观看视频免费 | 93久久精品日日躁夜夜躁欧美 | 精久久久久| www.狠狠操.com | 国产91丝袜在线播放动漫 | a在线免费 | 亚洲黄色软件 | 欧美午夜精品久久久久久孕妇 | 久草精品视频 | 精品在线一区二区三区 | 色综合久久久久综合体 | 综合在线色 | 91麻豆网 | 丁香激情五月婷婷 | 九色最新网址 | 五月婷婷狠狠 | 日韩a级黄色 | 亚洲人人射 | 色.www| 91大神精品视频在线观看 | 亚洲国产成人精品电影在线观看 | av在线com| 九九在线高清精品视频 | 亚洲国产成人高清精品 | 国产三级香港三韩国三级 | 99精品视频在线观看播放 | 国产精品99久久99久久久二8 | 麻豆传媒电影在线观看 | 日韩一区二区三区在线观看 | 久精品视频 | 久久久国产精品亚洲一区 | 日韩免费在线观看网站 | 国产在线美女 | 五月开心六月伊人色婷婷 | 在线观看一级 | 欧美视频www| 一区二区中文字幕在线观看 | 亚洲午夜久久久久久久久 | 97免费视频在线 | 国内久久看 | a午夜在线 | 麻豆精品视频在线 | 久久视频网 | 久久午夜电影 | 俺要去色综合狠狠 | 91天天操 | 五月网婷婷 | 国产精品免费av | 欧美黄在线 | 日韩黄色在线电影 | 成人四虎| 亚洲天天看| 免费能看的av | 奇米先锋| 欧美韩国在线 | 亚洲精品色 | 欧美性另类 | 日韩a级免费视频 | 欧美日韩免费一区二区 | aaa日本高清在线播放免费观看 | 久久久久夜色 | 一级成人在线 | 国产美女视频网站 | 97在线观看视频国产 | 国产第一二区 | 国产乱码精品一区二区蜜臀 | 五月婷久 | 伊人在线视频 | 日韩资源在线 | www·22com天天操 | 日本丶国产丶欧美色综合 | 国产免费观看高清完整版 | 狠狠搞,com| 国产精品久久久久免费观看 | 激情久久网 | 免费高清国产 | 狠狠躁日日躁夜夜躁av | 欧美一区二区免费在线观看 | 亚洲国产中文在线 | 久久精品久久综合 | 久久久久国产成人免费精品免费 | 国产成人久久av977小说 | 亚洲va在线va天堂va偷拍 | 99久高清在线观看视频99精品热在线观看视频 | 一区二区三区手机在线观看 | 久久毛片网 | 日韩黄色大片在线观看 | 丁香五月网久久综合 | 国产精品久久久久久久久蜜臀 | 国产综合久久 | 日韩视频一二三区 | 免费在线观看午夜视频 | 特级片免费看 | 国产麻豆精品95视频 | 天天操天天能 | 日韩欧美视频二区 | 国产亚洲精品电影 | 韩国三级在线一区 | 日韩精品网址 | 人人澡人人干 | 欧美色伊人 | 日韩精品在线播放 | 久久成人综合 | 国产生活一级片 | 久久精品久久久久久久 | 亚洲综合色丁香婷婷六月图片 | 国产成人一级电影 | 91夜夜夜| 国产一级做a | 99婷婷 | 国产 精品 资源 | 欧美一区二区三区在线看 | 久久天天躁狠狠躁夜夜不卡公司 | 日韩免费区 | 午夜在线国产 | 亚洲精品综合欧美二区变态 | 日批在线观看 | 欧美成人在线免费观看 | 91精品久久久久久久久久入口 | 91看毛片| 婷婷国产一区二区三区 | 欧美婷婷色 | 久久久久色 | 欧美另类sm图片 | 精品国产一区二区三区av性色 | 九色视频网 | 国产精品99久久久久 | 激情中文在线 | 欧美影院久久 | 日韩免费精品 | 91九色网站 | 天天爱天天操天天干 | 亚洲h色精品 | 在线观看午夜av | 日韩在线观看高清 | 日韩久久久久久久 | 国产日韩在线一区 | 91毛片在线 | 亚洲精品美女视频 | 亚洲高清视频在线观看免费 | 亚洲精品永久免费视频 | 日韩色中色 | 最近中文字幕mv免费高清在线 | 狠狠躁夜夜躁人人爽视频 | 婷婷在线观看视频 | 亚洲高清激情 | 国产手机视频在线 | 日韩无在线 | 久久久精品国产一区二区电影四季 | 国产精品尤物 | 免费a v在线 | 五月婷综合 | 国产一区私人高清影院 | 97在线视频观看 | 9在线观看免费高清完整版 玖玖爱免费视频 | 国产一区在线不卡 | 91精品在线视频观看 | 美女一区网站 | 久久在线精品视频 | 欧美午夜寂寞影院 | 日韩在线看片 | 免费看的av片 | 中文字幕乱码在线播放 | 日韩av免费大片 | 丁香婷婷深情五月亚洲 | 免费在线观看成人 | 91精品国产自产老师啪 | www好男人 | 美女黄频视频大全 | 国产丝袜制服在线 | 97超碰免费在线 | 狠狠色香婷婷久久亚洲精品 | 日本一区二区高清不卡 | a√天堂资源 | 人人澡人摸人人添学生av | 欧美一区二区三区四区夜夜大片 | 成人性生活大片 | 久久免费视频一区 | 91久久人澡人人添人人爽欧美 | 黄色毛片在线观看 | 欧美人牲 | 在线观看91 | 国产视频资源在线观看 | 日韩激情在线视频 | 亚洲成aⅴ人在线观看 | 黄色91免费观看 | 日韩av在线小说 | 97超碰网 | 久久热首页 | 日本婷婷色 | 国产不卡在线观看视频 | 国产破处在线视频 | 国产成人精品区 | 国产视频一区在线免费观看 | 少妇性bbb搡bbb爽爽爽欧美 | 色婷婷福利视频 | 久久高清片 | 99色网站 | v片在线看 | 亚洲精品免费观看视频 | 亚洲精品视频在线观看视频 | 久草影视在线观看 | 久久久久久久看片 | 三级av小说 | 国产99久久久国产精品免费二区 | 午夜精品99久久免费 | 精品国产色 | 国产无区一区二区三麻豆 | 91av在线播放| 韩日电影在线免费看 | 3d黄动漫免费看 | 草久久久久久 | 毛片二区| 国产精品视频在线观看 | 欧美激情精品久久久久 | 国产一级h | 免费看的黄色 | 久久成人欧美 | 综合网伊人 | 久久久影视| 91精品网站在线观看 | 久久亚洲欧美 | 亚洲在线视频网站 | 国产小视频免费观看 | 深爱开心激情网 | 午夜视频黄 | 久久成人精品视频 | 中文在线8新资源库 | 91看毛片| 五月婷婷在线观看视频 | 午夜私人影院久久久久 | av超碰在线观看 | 最新色站| 国产精品9999久久久久仙踪林 | 黄a网站 | www.777奇米| 日韩精品欧美精品 | 国内外成人免费在线视频 | 精品在线看| 久久久久免费精品国产小说色大师 | www.久久久精品 | 国产精品9999 | 国产高清精品在线 | 色噜噜在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 欧美国产日韩在线观看 | 五月婷婷视频 | 91久久影院 | 日日躁你夜夜躁你av蜜 | 99免费在线播放99久久免费 | 国产特级毛片aaaaaa毛片 | 国产黄色一级片在线 | 操操操av | 91成人精品国产刺激国语对白 | 中文字幕在线不卡国产视频 | 国产中文字幕视频 | 久久国产免费看 | 婷婷丁香六月天 | 久久免费黄色 | 色www永久免费 | 色中色资源站 | 国产高清视频网 | 久久久久久久久久久久国产精品 | 亚洲人成免费网站 | 欧美性网站| 狠狠色丁香婷婷综合久久片 | 色婷婷婷 | 日韩网站在线播放 | 久久经典国产视频 | 精品亚洲视频在线 | 激情综合中文娱乐网 | 在线视频久 | 粉嫩aⅴ一区二区三区 | 天天干夜夜干 | 在线视频 成人 | 国产精品久久久视频 | 一区二区三区四区五区六区 | 亚洲免费在线 | 日韩网页| 久草色在线观看 | 国产一区二区在线免费视频 | 日本黄色免费在线观看 | 手机成人av| 国产96在线观看 | 日韩网站免费观看 | 18久久久久久 | 久草在线在线 | 亚洲成a人片在线观看网站口工 | 日日夜夜免费精品视频 | 日韩 在线观看 | 日日摸日日添夜夜爽97 | 99视频| 97视频在线| 欧美老女人xx | 欧美日产一区 | 久久伦理网 | 免费看片网址 | 国产大陆亚洲精品国产 | 99免费看片 | 色综合天天做天天爱 | 热久久国产精品 | 91精品色| 国产精品6| 五月婷婷影院 | 成人免费网站视频 | 菠萝菠萝在线精品视频 | 91精品在线观看入口 | 日韩色在线观看 | 九七人人干 | 亚洲电影久久久 | 国产成人99久久亚洲综合精品 | 久久草在线精品 | 美女久久久久 | 午夜骚影 | 高清av网站| 国产视频在线观看一区二区 | 婷婷久久综合九色综合 | 在线日韩中文 | 久久久久久久久久久综合 | 久久久国产一区二区三区 | 成人中文字幕在线 | 国产高清一级 | 亚洲黄色av网址 | 人人艹视频| 国产精品一区二区免费看 | 国产一线二线三线在线观看 | 国产字幕在线播放 | 视频国产| 欧美aa一级片 | 黄色的视频网站 | 久久久久久久久亚洲精品 | 亚洲成人av免费 | 91精品久久久久久 | 色a在线观看 | 精品国产成人 | 国产xxxx做受性欧美88 | 欧美成人在线免费观看 | 黄色三级在线看 | 久久深夜福利免费观看 | 五月激情站 | 少妇性色午夜淫片aaaze | 亚洲在线视频免费观看 | 国产精品九九九 | 久久一区国产 | 久久免费的视频 | 一区在线播放 | 色婷婷亚洲精品 | 精品欧美乱码久久久久久 | 欧美一区免费观看 | 尤物一区二区三区 | 国产中文字幕在线视频 | 久久久久久美女 | 国内精品久久久 | 91香蕉视频色版 | 精品一区 在线 | 日韩精品你懂的 | 草草草影院| 丰满少妇高潮在线观看 | 久久国产网站 | 毛片网站在线看 | 天天色天天艹 | 中文乱幕日产无线码1区 | www.久久色.com | 国产三级av在线 | 四虎4hu永久免费 | 波多野结衣电影一区二区三区 | 五月婷婷激情网 | 日韩精品视频久久 | 国产精品密入口果冻 | 91女子私密保健养生少妇 | 日韩欧美在线观看一区二区三区 | 国产精品久久久久久久久搜平片 | 久久久久 免费视频 | 视频在线99 | 日韩av手机在线观看 | 日韩电影中文 | 精品久久一区二区 | 人人爽人人插 | 伊人影院99| 国产精品久久久99 | 久久av电影 | 一区二区三区四区五区六区 | 日韩在线观看的 | 亚洲国产中文在线观看 | 日韩av图片| 色综合久久久久久久 | 国产女v资源在线观看 | 夜夜爽88888免费视频4848 | 毛片3| av在线播放不卡 | 久久久精品国产免费观看一区二区 | 日韩美女一级片 | 精品欧美一区二区精品久久 | 国产精品999久久久 久产久精国产品 | 中文字幕乱码日本亚洲一区二区 | 久久精品视频在线 | 天天操天天舔天天干 | 西西444www大胆无视频 | 国内视频在线 | 久久久久高清毛片一级 | 欧美极品一区二区三区 | 国产精品丝袜在线 | 国产999精品久久久久久麻豆 | 免费看黄视频 | 日本久久久影视 | 国产小视频免费观看 | 欧美一二三区在线观看 | 狠狠狠狠狠狠 | 国产视频美女 | 正在播放国产精品 | 五月天堂色 | 久久深夜福利免费观看 | 久久网站免费 | 日韩中文在线观看 | 97人人澡人人添人人爽超碰 | 久久草在线精品 | 国产亚洲欧美在线视频 | 精品在线不卡 | 美女一二三区 | 日日夜夜噜噜噜 | 免费av网址大全 | 欧美粗又大 | 亚州精品一二三区 | 27xxoo无遮挡动态视频 | 激情欧美在线观看 | 日操操 | 中文字幕中文中文字幕 | 日韩中文字幕电影 | 国产在线更新 | 51久久成人国产精品麻豆 | 中文伊人 | 黄色av成人在线 | 四虎8848免费高清在线观看 | 亚洲人成免费网站 | 国产精品一区二区三区观看 | av免费看在线 | a视频免费在线观看 | 国产麻豆精品传媒av国产下载 | 五月天综合色 | 欧美aa一级片 | 久久精品91视频 | 亚洲成人xxx | 久久经典国产 | 在线观看久久久久久 | 久一在线 | 日日摸日日爽 | 日韩一区二区三区在线观看 | av免费网站 | 欧美极品在线播放 | a级一a一级在线观看 | 四虎最新域名 | 97碰碰视频 | 成人动漫一区二区 | 日韩久久精品一区 | 51久久成人国产精品麻豆 | 国产又黄又猛又粗 | 国产精品久久久久久久久久久久午夜片 | 精品国产一区二区三区在线观看 | 久久精品影片 | 91麻豆文化传媒在线观看 | 91看片在线 | 精品国产成人av | 国产一级片免费观看 | 久久午夜色播影院免费高清 | 成人免费观看大片 | 国产精品久久久久毛片大屁完整版 | 99久久精品免费一区 | a黄色一级 | 国产精品免费高清 | av在线影片 | 一本一本久久aa综合精品 | 丝袜美腿亚洲综合 | 手机看片福利 | 国产专区一 | 亚洲视频精选 | 91人网站| 五月婷婷色播 | 中文字幕在线看视频国产中文版 | 亚洲精品大全 | 久久中文精品视频 | 91麻豆看国产在线紧急地址 | 98久久| av久久在线 | 91中文在线 | 丁香六月五月婷婷 | 日韩三级一区 | 国产一级免费片 | 亚洲精品国精品久久99热一 | 日韩国产精品毛片 | 超碰97久久 | 成人三级视频 | 一本色道久久综合亚洲二区三区 | 人人爽影院 | 日日干天天 | 亚在线播放中文视频 | 在线视频欧美亚洲 | 亚洲资源视频 | 亚洲在线黄色 | 日韩一区二区三免费高清在线观看 | 日韩3区 | 日本乱视频 | 91视频免费网址 | 黄色一级免费 | 国产专区免费 | 国产亚洲精品精品精品 | 亚洲综合小说电影qvod | 国产一区二区不卡视频 | 中文字幕亚洲不卡 | 国产最新在线观看 | 色综合久久悠悠 | 久久字幕精品一区 | 狠狠撸电影 | 一本一道久久a久久精品蜜桃 | 国产精品亚洲片在线播放 | 日日干干夜夜 | 国产97在线播放 | 日韩欧美一区二区三区在线观看 | www.xxx.性狂虐 | 久久精品国产免费看久久精品 | 久久一区精品 | 欧美小视频在线观看 | 在线观看岛国av | 亚洲精品免费在线 | 亚洲男模gay裸体gay | 国外av在线 | 久久手机免费视频 | 亚洲激情在线视频 | 国产日韩在线看 | 国产精品免费久久久 | 九九视频免费观看视频精品 | 久av电影| www成人av| 国产免费二区 | 国产手机视频在线 | 狠狠色丁香九九婷婷综合五月 | 国产亚洲精品久久久久久移动网络 | 99久久国产免费,99久久国产免费大片 | 91大神免费视频 | 久久看片网 | 91麻豆精品国产91久久久使用方法 | 久久久久久久免费观看 | 日韩精品中文字幕在线观看 | 国产xxxx做受性欧美88 | www.黄色片网站 | 日韩欧美国产精品 | 中文字幕在线日本 | 日本福利视频在线 | 亚洲精品欧美视频 | 日韩欧美在线观看一区二区三区 | 91在线精品播放 | 成人在线视频你懂的 | 97超碰在线免费观看 | 91在线免费视频观看 | 最近免费在线观看 | 黄色三级免费片 | 国产精品久久久久永久免费 | 久热爱| 日本乱码在线 | 一区二区高清在线 | 国产视频手机在线 | 国产精品国产三级国产不产一地 | 在线黄色免费av | 久久精品视频免费 | 中文字幕电影高清在线观看 | 亚洲精品午夜aaa久久久 | 色美女在线 | 在线看av网址| 欧美伦理一区 | 免费看黄网站在线 | 亚洲综合色丁香婷婷六月图片 | 婷婷丁香在线 | 日韩精品第一区 | 天天天干天天天操 | 国产精品久久久久久久久久免费 | 国产成人精品一区二区在线观看 | 欧洲精品码一区二区三区免费看 | 最近中文字幕在线中文高清版 | 97人人添人澡人人爽超碰动图 | 91在线精品播放 | 日三级在线| 五月激情姐姐 | 久久av中文字幕片 | 中文字幕在线观看一区二区 | 欧美久久久久久久久久 | 亚洲精品成人av在线 | 最近高清中文字幕在线国语5 | 国产性xxxx | 在线观看中文字幕第一页 | 精品一区二区精品 | av中文国产 | 中文字幕之中文字幕 | 精品久久久久久久久久岛国gif | 国产97色在线| 婷婷综合五月天 | 网站在线观看你们懂的 | 日本精品久久久久久 | 亚洲欧洲日韩 | 日韩中文幕 | 在线黄网站 | 天天操天天干天天综合网 | 黄色午夜网站 | 成人a级免费视频 | 激情欧美国产 | 午夜av免费看 | 亚洲午夜精品久久久久久久久久久久 | 免费看污片 | 日韩成人精品一区二区 | 在线一二三四区 | 中文字幕精品一区久久久久 | 日韩美精品视频 | 蜜桃视频在线观看一区 | 国产成人精品av在线观 | 2021国产视频 | 日韩av电影手机在线观看 | 日韩理论片 | 九九免费在线观看 | 日韩欧美在线高清 | 亚洲综合视频在线 | av在线收看 | 日韩av男人的天堂 | 91亚洲精品乱码久久久久久蜜桃 | 久久精品直播 | 天天射天天| 丁香视频在线观看 | 一级精品视频在线观看宜春院 | 精品国产中文字幕 | 精品美女久久久久 | 国产精品中文字幕在线 | 色婷婷综合在线 | 日韩中文字幕免费电影 | 亚色视频在线观看 | 国产黄色大片 | 中文字幕在线观看完整版电影 | 国产a国产 | 亚洲精品网站在线 | 日韩欧美精品一区二区 | 国产精品对白一区二区三区 | 日韩欧美在线观看一区二区 | 不卡电影免费在线播放一区 | 69av在线播放 | 国产黄色免费看 | 美女网站在线看 | 91亚洲国产成人久久精品网站 | 91成人区| www国产亚洲 | 日韩影视在线 | 色网站在线免费观看 | 97人人模人人爽人人喊网 | 国产精品刺激对白麻豆99 | 国产又粗又猛又爽 | 国产中文字幕视频在线 | 黄色在线观看免费网站 | 久久久69 | 97激情影院 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 日韩69视频 | 久久视频99 | 99这里只有| 黄色大片视频网站 | 日韩国产精品久久 | 久久精品中文字幕少妇 | 91九色视频网站 | 日韩在线小视频 | 国产日韩精品一区二区 | 五月综合在线观看 | 国产视频 亚洲精品 | 一本大道久久精品懂色aⅴ 五月婷社区 | 中文字幕在线影院 | 干干日日 | 99热精品国产一区二区在线观看 | 欧美一级性 | 一区二区三区在线影院 | 亚洲精品动漫成人3d无尽在线 | 最新中文字幕在线资源 | 青青河边草免费观看完整版高清 | 插综合网| 久久久天天操 |