鞏固複習(Django最基礎的部分_具體查看官方文檔)

Django學習路1
1.腳本不能隨便運行,沒準 linux 運行完就上不去了
2.pip 在 linux 上 寫 pip3
    同理 python 寫爲 python3
3.在 pycharm 上安裝庫以後,在命令提示符中依舊須要安裝
    才能在終端進行使用
4.在虛擬環境下安裝 uwsgi
5.升級 django 到2.0版本解決  pip3 install django==2.0.4
    ImportError: cannot import name 'path'
6.python3 manage.py migrate 解決
    You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
7.python3 manage.py runserver
    打開網址就能夠運行成功了

使用 1.11.14 版本較多,推薦使用

Django學習路2
1.導入 Django 工程時 在 manage.py 上一級目錄導入
2.Add local 本地    Add Remote 遠端
3.BASE_DIR 項目所在目錄的絕對路徑
4.SECRET_KEY  至關於密鑰
5.項目開發後->進行測試->演示環境->上線生產環境
6.DEBUG = True 調試模式
7.ALLOWED_HOSTS = [] 運行訪問的主機,寫 ip 地址
    ALLOWED_HOSTS = ["*"] 表示全部人訪問
8.INSTALLED_APPS Django 內置應用
9.MIDDLEWARE 中間件,面向切面編程
10.ROOT_URLCONF 根路由
11.TEMPLATES 模板
12.WSGI_APPLICATION 部署應用
13.DATABASES 數據庫
14.db.sqlite3 輕量級數據庫,安卓 ios 內都具有
    不用於企業開發,和 mysql 相似
15.AUTH_PASSWORD_VALIDATORS 認證密碼驗證器
16.LANGUAGE_CODE 語言編碼 英文 'en-us'
    中文 LANGUAGE_CODE = 'zh-hans'
17.TIME_ZONE 統一協調時間  'Asia/Shanghai'

Django學習路3
1.打開 Data Source
alt insert 打開 Data Source 找到 db.sqlite3 肯定
Download 下載後 TestConnection 測試是否成功
2.項目下的 urls.py 文件
    urlpatterns 匹配網頁集合
    寫法 url(正則,views.函數)
     url(r'函數名/',views.函數) 最好是斜線結尾
      views 來自建立的 app 中,須要導入
       views.py 內定義函數 def 函數名(request):pass
        HttpResponse("內容") 進行響應
         內容能夠是 HTML 代碼(a標籤,h1標題等等)
        render(request,"模板名字")
         render(request,"index.html")
          直接寫文件名.html
3.進行訪問 127.0.0.1:8000/函數名
4.templates 包含 HTML 文件
    顯示數據 -> 在 urls.py 中添加
     url(r"函數名/",views.函數名)
5.讓項目和建立的 App 鏈接
    在項目的 settings.py 文件的 INSTALLED_APPS 中添加 建立的 APP 名字
    例:INSTALLED_APPS = ['...','...','App']
6.SyntaxError: Generator expression must be parenthesized
打開 ~/HanyProject/venv/lib/python3.7/site-packages/django/contrib/admin 的 widgets.py 文件 到 151 行 將params.items() 後面的逗號去掉
7.升級 Django 到 2.x 版本
8.將 templates 加入到 settings 的 TEMPLATES 中 的 'DIRS''DIRS': [os.path.join(BASE_DIR, 'templates')]
9.出現錯誤先看日誌文件

urls.py 文件


from django.contrib import admin
from django.urls import path

from Hanyapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'sayHello/',views.sayHello),
    path(r'goBaiDu/',views.goBaiDu),
    path(r'index/',views.index)
]



views.py


from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.

def sayHello(request):
    return HttpResponse("<h3> 你好,世界 <h3>")

def goBaiDu(request):
    return HttpResponse("<a href = 'www.baidu.com'>百度</a>")

def index(request):
    return render(request,'index.html')


settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Hanyapp'
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
    用戶名:<input type="text" placeholder="請輸入用戶名">
    密碼:<input type="password">
</body>
</html>

Django坑_01

python manage.py runserver 運行出錯
hostname, aliases, ipaddrs = gethostbyaddr(name)
UnicodeDecodeError: 'utf-8'

解決:
將計算機的名字改成英文,從新啓動便可

 Django建立簡單數據庫

在 建立好的 app 目錄下的 models.py 中,編寫建立 數據庫表的限制條件

class Student(models.Model):
    s_name = models.CharField(max_length=16)
    s_age = models.IntegerField(default=1)



在控制檯編寫以下語句

生成遷移文件
python manage.py makemigrations

執行遷移
python manage.py migrate

Django學習路4_數據庫添加元素,讀取及顯示到網頁上

在 views 中實現對數據庫的添加和讀取數據庫


添加數據

對象 = models 中建立的類名()
對象.列名 = '字段值' 
對象.save() 進行保存
return HttpResponse('提示信息')


def add_student(request):
    stu = Student()
    stu.s_name = 'Hany_%d'%(random.randrange(10))
    stu.save()
    return HttpResponse("添加成功,添加的姓名爲 %s"%(stu.s_name))

在 urls 中的 urlpatterns 中進行註冊

url(r'addstu',views.add_student),


讀取數據

對象 = models 中的類名.objects.all()
來獲取objects 的接口

建立 context (字典對象)傳遞給 templates 中的 html 文檔
context 的鍵是html 中須要使用的,值是須要顯示的
context 是 from django.shortcuts import render 函數的參數
context = {
  '':值,
  '鍵2':值2
}


def get_student(request):

    stus = Student.objects.all()
    # 獲取全部學生,objects 操做的入口
    context = {
        'hobby':'使用 Python 學 Django !',
        'stus':stus
    }
    # context 是一個字典,用來與 html 代碼進行關聯
    return render(request,'stu_list.html',context = context)


注:stu_list.html 是在 templates 中建立的 stu_list.html 文檔


在 HTML 代碼中顯示

使用 {{view.py 函數中傳遞過來的 context 參數的鍵}} 便可訪問
若是須要顯示所有的數據,須要進行遍歷
for 循環
{{% for 對象 in 鍵%}}
<標籤名>{{對象.表的列名}}</標籤名>
{{endfor}}


注:表的列名:models 的類中定義的屬性


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>StudentList</title>
</head>
<body>
<h2>學生表</h2>
<h3> {{hobby}}</h3>

<h1>學生名單</h1>
<ul>
    {% for stu in stus %}
    <li>{{ stu.s_name }}</li>
    {% endfor  %}
</ul>
</body>
</html>

Django學習路5_更新和刪除數據庫表中元素

查找全部的元素
Student.objects.all()

查找單個元素
Student.objects.get(主鍵=值)
    主鍵 pk = xxx

更新數據庫數據後進行保存
stu.save()

刪除數據庫表中的行
stu.delete()


須要注意的點:
update_student 函數和 delete_student 函數 返回值裏面沒有 request


def update_student(request):
    stu = Student.objects.get(pk = 2)
    # pk 主鍵值
    stu.s_name = 'Jack'
    stu.save()
    return HttpResponse("更新成功!")

def delete_student(request):
    stu = Student.objects.get(pk = 3)
    stu.delete( )
    return HttpResponse("刪除成功")


urls.py 須要更新的內容    
  url(r'updatestu',views.update_student),
  url(r'deletestu',views.delete_student)

關於更新和存儲的區別:
若是主鍵存在則爲 更新表中元素
若是主鍵不存在則爲 存儲該元素

Django學習路6_修改數據庫爲 mysql ,建立mysql及進行遷徙

在項目的 settings 中修改 
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE':'django.db.backends.mysql',
        'NAME':'Hany_mysql',
        'USER':'root',
        'PASSWORD':'root',
    #     mysql 位置
        'HOST':'127.0.0.1',
        'POST':'3306' #能夠進行修改,避免攻擊
    }
}


建立數據庫

create database Hany_mysql charset=utf8;

在 pycharm 中建立一個 mysql 數據庫
選擇加號,選擇 mysql

 

 

選擇 Download 後點擊 Test Connection


進行遷徙到 MySQL 數據庫中
python manage.py migrate

注:若是出現缺失 MySQLdb 則須要進行安裝這個第三方庫

解決方案:
在 項目根目錄下的 __init__.py 文件中 輸入

import pymysql
pymysql.install_as_MySQLdb()
# 假裝成 MySQLdb

Django學習路7_註冊app到可以在頁面上顯示app網頁內容

在根目錄下建立一個 app3 

建立一個 urls.py 
在 urls.py 中添加 urlpatterns 列表
容納須要顯示在頁面上的函數

from django.conf.urls import url
from app3 import views

urlpatterns = [
    url(r'index',views.index)
]

注:
r'在網頁上的函數名',views.py 中的函數名

在 views.py 中建立剛剛建立好的 index 函數
注: views.函數名 , 函數名是什麼,這裏的函數就建立什麼名字

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from django.template import loader


def index(request):
    three_index = loader.get_template('app3_index.html')
    result = three_index.render()
    print(result)
    return HttpResponse(result)

注:
loader.get_template 獲取模板
three_index.render() 渲染爲 html 文檔

模板在 templates 中進行建立

在 app3 目錄下,建立 templates 文件夾,存放 html 文檔

app3_index.html

注:
文檔名字隨意,可是模板文件夾名字必定是 templates

app3_index.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>App3 index</title>
</head>
<body>
<h2>加油</h2>
</body>
</html>



在項目的 settings 中的 INSTALLED_APPS 列表中,添加 app3

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app.apps.AppConfig',
    'app2.apps.App2Config',
    'app3.apps.App3Config'
]

注:
也能夠寫爲 'app3'


在 項目的 urls.py 中導入 app3 在頁面上進行顯示

from django.contrib import admin
from django.urls import path, include

from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'hello',views.hello),
    path(r'index',views.index),
    path(r'home',views.home),
    path(r'app2',include('app2.urls')),
#     導入一組數據,使用 include
    path(r'app3',include('app3.urls'))
]

注:
使用 include('app名字.urls') 能夠導入整個 app 包

擴展:
 app3 下的 apps.py 內容


from django.apps import AppConfig

class App3Config(AppConfig):
    name = 'app3'

運行:
python manage.py runserver

輸入
http://127.0.0.1:8000/app名字/頁面顯示的名字

 
http://127.0.0.1:8000/app3/index

 

 

 

 

 

 

以上爲添加到表中的元素

學生查詢班級名字


在views.py 中添加函數方法,讓學生獲取班級姓名
此處應該注意數據庫表 models.py 中的設計,使用的是類中定義的屬性

def get_grade(request):
    # 經過學生 -> 班級
    stu = Student.objects.get(pk = 1)
    # 獲取學生
    grade = stu.s_grade
    # 獲取學生所在的班級
    return HttpResponse("Grade: %s"%(grade.g_name))
    # 獲取班級的名字

注:
pk 是主鍵的意思
. 後面的名字都是本身設置的 類中的屬性名


在 urls 中添加 get_grade  剛剛建立的函數

urlpatterns = [
    url(r'index',views.index),
    url(r'getgrade',views.get_grade)
]


運行後,結果以下

 

班級查詢學生名字

在 views.py 中添加 對應的獲取函數
函數名:get_students

def get_students(request):
    # 經過班級獲取學生信息
    grade = Grade.objects.get(pk = 1)
    # 獲取學生集合
    stus = grade.student_set.all()
    context = {
        # 添加到字典的值中
        'students':stus
    }
    return render(request,'students_list.html',context = context)
    # 使用 render 顯示網頁

注:
1.獲取所有 grade.student_set.all() 學生信息
2.將獲取到的信息存入到 context 的值中,纔會在網頁裏進行遍歷
    這裏的鍵名,是網頁中遍歷的可迭代對象
3.使用 render 網頁纔會被渲染出來


在 templates 中添加 html 文檔
students_list.html

<h3>
    {% for stu in students %}
    <li> {{ stu.s_name }}</li>
    {% endfor %}
</h3>

注:
1.使用 for 循環對傳入的 context 參數進行遍歷
2.使用 {% 語句 %} 的格式寫入 python 代碼
3.{{endfor}} 在結尾後


在 urls.py 中添加獲取學生的函數

urlpatterns = [
    url(r'index',views.index),
    url(r'getgrade',views.get_grade),
    url(r'getstudent',views.get_students)
]


運行結果

 Django學習路9_流程複習

https://www.cnblogs.com/hany-postq473111315/p/12856419.html

Django學習路10_建立一個新的數據庫,指定列名並修改表名
在 models.py 中添加

from django.db import models

# Create your models here.

class Person(models.Model):
    # 假裝成 models
    p_name = models.CharField(max_length=16,unique=True,db_column='name')
    # unique  設置爲惟一
    # db_column 列名

    p_age = models.IntegerField(default=18,db_column='age')
    # default 設置默認值
    # False 表明男,True 表明女
    p_sex = models.BooleanField(default=False,db_column='sex')

    class Meta:
        db_table = 'People'
        # 修改表名


unique 設置爲惟一的
db_column 指定列名
default 設置默認值

Meta 加入元信息 
db_table 指定表名


當存在 布爾類型時 數據庫表中表示爲 TINYINT(1)  節省空間

default 只有當存入數據時,纔會進行使用

Django學習路11_向數據庫中添加 和 獲取指定條件數據
在 views.py 中添加函數 向數據庫中添加數據

def add_persons(request):

    for i in range(15):
        person = Person()
        flag = random.randrange(100)
        person.p_name = "Hany_ %d"%(i)
        person.p_age = flag
        person.p_sex = flag%2
        person.save()
    return HttpResponse("批量添加成功")

注: 
使用隨機數,進行添加數據(目前仍是靜態數據)
添加表中的元素屬性值
save 進行保存
在使用 random 以前先進性導入


http://127.0.0.1:8000/app4/addpersons


添加一條數據

def add_person(request):
    person = Person.objects.create(p_name='Yizhan')
    # 使用 objects.create 進行建立一條數據
    person.save()
    return HttpResponse("%s 建立成功"%(person.p_name))

注:
使用 create 方法進行建立


 

 

獲取數據

def get_persons(request):
    # persons = Person.objects.filter(p_age__gt=30)
    '''age 大於 30 的 '''
    # persons = Person.objects.filter(p_age__gt=30).filter(p_age__lt=80)
    '''.filter .filter 表示且'''
    persons = Person.objects.exclude(p_age__lt=30).exclude(p_age__gt=80)
    '''age 大於 30 的 , 小於 80 的,exclude 除了,不包含的意思 '''
    print(type(persons))
    '''<class 'django.db.models.query.QuerySet'> 結果集類型'''
    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)

注: 
.filter(表示包含的條件)
.filter(表示包含的條件).filter(表示包含的條件)  表示兩個條件都須要知足,且

獲取到的數據都是 QuerySet 類型,放入到值中,使用網頁進行遍歷
這裏使用的是 render ,不是 HttpResponse

p_age__gt 表示大於
p_age__lt 表示小於



獲取一條數據
objects.get(條件)

first() 返回查詢集中的第一個對象

last() 返回查詢集中的最後一個對象

count() 返回當前查詢集中的對象個數

exists() 判斷查詢集中是否有數據,返回 True 和 False
True 表示有數據

def get_person(request):
    person = Person.objects.get(p_age = 48)
    context = {
        'person':person
    }
    return render(request,'person_one.html',context = context)

注: 
若是沒有查詢到數據,則會報 500 服務器異常
DoesNotExist 異常

若是查詢到的對象多於一個,返回兩個對象也會報錯
MultiObjectsReturned 異常


 

 

templates 中person_list.html 內容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>Person 大於 30 的 , 小於 80 的 :</h2>
<h4>
    {% for person in persons %}
    <li>
        姓名:{{ person.p_name }} 年齡{{ person.p_age }}
    </li>
    {% endfor %}
</h4>
</body>
</html>

注:
在 for 循環的時候兩邊有 {%    %}
正常單個語句時,使用的是 {{ 屬性}}
最後要加上 {% endfor %}

此處的 屬性爲數據庫表中的元素


不要忘了的點:

urlpatterns = [
    url(r'addpersons',views.add_persons),
    url(r'getpersons',views.get_persons),
    url(r'addperson',views.add_person)
]

在 urls.py 中 ,進行註冊


啓動命令

python manage.py runserver

 

使用類方法建立單個對象示例:

在 models.py 中自定義類方法 create 進行建立

    @classmethod
    def create(cls,p_name,p_age = 100,p_sex = True):
        # 自定義方法進行建立對象,能夠包含表達式
        return cls(p_name = p_name,p_age = p_age,p_sex = p_sex)

views.py 中 add_person 函數

def add_person(request):
    person = Person.create('Lao')
    person.save()
    return HttpResponse("建立成功")

Django學習路12_objects 方法(all,filter,exclude,order by,values)
Person.objects.all()
獲取所有數據

def get_persons(request):

    persons = Person.objects.all()
    # 獲取所有數據

    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)
使用 order_by  默認爲 id 進行排序

def get_persons(request):

    persons = Person.objects.all().order_by("p_age")
    # 獲取所有數據

    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)

注:
order_by(" 列名 ") 列名寫在引號中
使用 filter 對錶中元素進行篩選
符合條件的留下,  .filter(條件).filter(條件) 表示 兩個條件都要知足

def get_persons(request):
    persons = Person.objects.filter(p_age__gt=30)
    '''age 大於 30 的 '''

    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)

注:
filter 將知足條件的保存下來
gt 表示 大於 
lt 表示小於
使用兩個 filter 表示 且

def get_persons(request):
    persons = Person.objects.filter(p_age__gt=30).filter(p_age__lt=80)
    '''.filter .filter 表示且'''
    # persons = Person.objects.filter(p_age__gt=30)
    '''age 大於 30 的 '''

    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)
exclude 表示不包含的,在條件以外的數據

def get_persons(request):
    persons = Person.objects.exclude(p_age__lt=30)
    '''age 大於 30 的'''
    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)

注:
條件 在這裏是 p_age__lt=30 即表示 小於 30
Person.objects.exclude(條件).exclude(條件)
表示 兩個條件都不知足的數據

def get_persons(request):
    persons = Person.objects.exclude(p_age__lt=30).exclude(p_age__gt=80)
    '''age 大於 30 的 , 小於 80 的,exclude 除了,不包含的意思 '''
    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)
values 
獲取 <QuerySet [{表中行元素},{表中行元素}, ....,{表中行元素}]>

很相似於 json 數據

def get_persons(request):
    persons = Person.objects.exclude(p_age__lt=30).exclude(p_age__gt=80)
    '''age 大於 30 的 , 小於 80 的,exclude 除了,不包含的意思 '''
    print(persons.values())
    context = {
        'persons':persons
    #     傳遞到前端代碼中
    }
    return render(request,'person_list.html',context = context)

注:
只是添加了 persons.values() 
獲取到的數據爲 

<QuerySet [{'id': 2, 'p_name': 'Hany_ 1', 'p_age': 31, 'p_sex': True}, {'id': 5, 'p_name': 'Hany_ 4', 'p
_age': 78, 'p_sex': False}, {'id': 7, 'p_name': 'Hany_ 6', 'p_age': 47, 'p_sex': True}, {'id': 12, 'p_na
me': 'Hany_ 11', 'p_age': 77, 'p_sex': True}, {'id': 13, 'p_name': 'Hany_ 12', 'p_age': 48, 'p_sex': Fal
se}]>

Django學習路13_建立用戶登陸,判斷數據庫中帳號名密碼是否正確

在 models.py 中設置數據庫表的信息

from django.db import models

# Create your models here.

class User(models.Model):
    u_name = models.CharField(max_length=16,unique=True)
    # 用戶名惟一
    u_password = models.CharField(max_length=256)
    # 設置密碼


產生遷移文件,進行遷移

python manage.py makemigrations 

python manage.py migrate


urls.py 產生路由

from django.conf.urls import url

from app5 import views

urlpatterns = [
    url(r'getuser',views.get_user)
]


在 views.py 中編寫函數

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from app5.models import User

def get_user(request):
    username = "qqq"
    # 用戶輸入的用戶名
    password = "000"
    # 密碼
    users = User.objects.filter(u_name = username)
    # 查看 User 表有沒有 username
    if users.count():
    # .count 也能夠寫爲 .exists,直接判斷是否存在
    #     有就是 1  , 沒有就是 0
    # user 用戶存在
        user = users.first()
    #     取數據  last() 也能夠
        if user.u_password == password:
            print("登錄成功")
        else:
            print("密碼錯誤")
    else:
        print("用戶名不存在")
    return HttpResponse("獲取成功")

注:
靜態的設置了帳號密碼,根據數據庫的 user 表查看是否存在該數據
.count() 和 .exists()  均可以判斷是否存在該數據
先驗證用戶名是否存在,再判斷密碼是否存在

Django學習路14_獲取數據庫中用戶名字並展現,獲取指定條數
在 views.py 中添加 獲取函數
注:此時獲取的是所有用戶的信息

def get_users(request):
    users = User.objects.all()
    context = {
        'users':users
    }

    return render(request,'user_list.html',context = context)

注:
若是使用切片,則在 all() 後面 [ 起始:結束]  
這裏須要注意的是  QueueSet 類型是 左閉右閉 的
若是這裏寫的對,沒顯示數據,那就是 user_list.html 有問題


在 urls.py 中 進行註冊

from django.conf.urls import url

from app5 import views

urlpatterns = [
    url(r'getuser/',views.get_user),
    url(r'getusers/',views.get_users)
]


在 數據庫表中添加一些用戶密碼

 

app5 下的 templates 文件夾下 建立 user_list.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    {% for user in users %}
    <li>{{ user.u_name }}</li>
    {% endfor %}
</ul>
</body>
</html>

注:
for 循環寫在 <ul> 標籤下,不是 <hn>標籤
<li> 標籤裏面寫內容,爲了整齊,造成有序列表 



獲取指定條數數據

第二條數據 到 第五條數據

def get_users(request):
    users = User.objects.all()[1:5]

    context = {
        'users':users
    }

    return render(request,'user_list.html',context = context)


注:
切片是左閉右閉的
[起始位置:結束位置]

之前的 字符串等等,都是左閉右開的!!

Django坑_02

在建立訂單的時候會建立一個對應的日期

查詢數據庫表的時候,查詢年的話能夠正常實現 

可是若是單獨查詢某一個月的話,可能會出錯  

在 Django 中月份可能會使用 Django 中定義的時區 

將 項目 settings.py 中的  USE_TZ = True 改成 False

Django學習路15_建立一個訂單信息,並查詢2020年\9月的信息都有哪些
複製代碼
在 app5.models.py 中添加一個 Order 表

class Order(models.Model):
    o_num = models.CharField(max_length= 16 ,unique=True)
    # 建立一個訂單號,設置爲 惟一
    o_time = models.DateTimeField(auto_now_add=True)
    # 建立一個時間,當對象進行保存時便可生成訂單時間

注:
auto_now_add 當進行 save() 保存時,就會自動進行設置時間
複製代碼

產生遷移 -> 進行遷移

 

插入數據 以下所示


修改後的數據


複製代碼
在 urls 中添加獲取訂單的函數 getorders

urlpatterns = [
    url(r'getuser/',views.get_user),
    url(r'getusers/',views.get_users),
    url(r'getorders',views.getorders)
]
複製代碼
複製代碼
在 views.py 中添加獲取 2020年 的函數

def getorders(request):
orders = Order.objects.filter(o_time__year= 2020)
context = {
'orders':orders
}
return render(request,'orders.html',context = context)
複製代碼
複製代碼
在 templates 的 orders.html 中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    {% for order in orders %}
    <li>{{ order.o_num }}</li>
    {% endfor %}
</ul>
</body>
</html>
複製代碼

複製代碼
獲取 9 月的信息

項目根目錄的 settings.py 中的 USE_TZ = False 提早設置好

def getorders(request):
    orders = Order.objects.filter(o_time__month = 9)
    context = {
        'orders':orders
    }
    return render(request,'orders.html',context = context)
複製代碼


Django學習路16_獲取學生所在的班級名
在 urls.py 中先導入getgrades

from django.conf.urls import url

from app5 import views

urlpatterns = [
    url(r'getuser/',views.get_user),
    url(r'getusers/',views.get_users),
    url(r'getorder',views.getorders),
    url(r'getgrades',views.getgrades),
]
在 views.py 中編寫 getgrades 函數

def getgrades(request):
    grades = Grade.objects.filter(student__s_name='qq')
    # 班級裏包含名字爲 qq 的
    for grade in grades:
        print(grade.g_name)

    return HttpResponse("獲取成功")
此前的準備工做:建立數據庫表 

class Grade(models.Model):
    g_name = models.CharField(max_length=16)

class Student(models.Model):
    s_name = models.CharField(max_length= 16)
    s_grade = models.ForeignKey(Grade,on_delete=True)
    # 設置班級外鍵

Django學習路17_聚合函數(Avg平均值,Count數量,Max最大,Min最小,Sum
使用方法:
類名.objects.aggregate(聚合函數名('表的列名'))

聚合函數名:
Avg 平均值

Count數量

Max 最大

Min 最小

Sum 求和

示例:
Student.objects.aggregate(Max('sage'))
建立消費者數據表 Customer

class Customer(models.Model):
    c_name = models.CharField(max_length = 16)
    # 消費者名字
    c_cost = models.IntegerField(default = 10)
    # 消費的金額
產生遷移文件
python manage.py makemigrations

進行遷移
python manage.py migrate
Max 示例

def getcostmax(request):
    cost_max = Customer.objects.aggregate(Max("c_cost"))
    print(cost_max)
    return HttpResponse("獲取成功")
Min示例
def getcostmin(request):
    cost_min = Customer.objects.aggregate(Min("c_cost"))
    print(cost_min)
    return HttpResponse("獲取成功")

注:
不要忘記在 urls.py 中進行註冊
Sum 示例

def getcostsum(request):
    cost_sum = Customer.objects.aggregate(Sum("c_cost"))
    print(cost_sum)
    return HttpResponse("獲取成功")

Count 示例
def getcustomercount(request):
    customer_count = Customer.objects.aggregate(Count("c_name"))
    print(customer_count)
    return HttpResponse("獲取成功")

注:
此時獲取姓名便可,不用獲取價格
Avg 示例
def getcostavg(request):
    cost_avg = Customer.objects.aggregate(Avg("c_cost"))
    print(cost_avg)
    return HttpResponse("獲取成功")

導入的包

from django.db.models import Max, Min, Sum, Count, Avg
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from app5.models import User, Order, Grade, Customer

Django學習路18_F對象和Q對象
F 對象:
可使用模型的 A 屬性和 B 屬性進行比較
寫法:
須要的數據對象 = 數據表(類名).objects.filter(列名__條件=F('列名2'))
需求: 查看男生數量比女生少 的公司名稱
companies = Company.objects.filter(c_boy_num__lt=F('c_girl_num'))

F 對象支持算術運算

需求: 查看男生數量比女生少 15個的公司名稱
companies = Company.objects.filter(c_boy_num__lt=F('c_girl_num')-15)
在 models.py 中建立數據表 Company

class Company(models.Model):
    c_name = models.CharField(max_length=16)
    # 公司名字
    c_girl_num = models.IntegerField(max_length=16)
    # 女生人數
    c_boy_num = models.IntegerField(max_length=16)
    # 男生人數
產生遷移文件
python manage.py makemigrations

進行遷移
python manage.py migrate
在 urls.py 中進行註冊

需求:
查看 女生多於男生的公司名稱

url(r'getgirlgtboy',views.getgirlgtboy)

views.py 中建立 getgirlgtboy 函數

def getgirlgtboy(request):
    companies = Company.objects.filter(c_girl_num__gt=F('c_boy_num'))
    for company in companies:
        # 進行遍歷後查看公司名
        print(company.c_name)
    return HttpResponse("獲取成功")

注:
F 導包 導入的是 
from django.db.models import F

F 對象使用 算數表達式

def getgirlgtboy(request):
    companies = Company.objects.filter(c_girl_num__lt=F('c_boy_num')-30)
    # 查看男生比女生多於 30 的
    for company in companies:
        # 進行遍歷後查看公司名
        print(company.c_name)
    return HttpResponse("獲取成功")

Q 對象
過濾器的方法中的參數 
經常使用於 組合條件

表名(models中建立的類) .objects.filter(Q(表中列名__條件=值))

示例:
Student.objects.filter(Q(sage_lt=25))

Q對象支持 | & ~ 

年齡大於等於 25 的
分析: 不小於 25
示例:
Student.objects.filter(~Q(sage_lt=25))
Q 對象能夠對條件進行封裝
封裝後支持邏輯運算
與 & 或 |非 ~

在 urls.py 中進行註冊

url(r'getgirlandboy',views.getgirlandboy)

在 models.py 中添加 對應的函數 getgirlandboy

def getgirlandboy(request):
    companies = Company.objects.filter(Q(c_boy_num__gt=90) & Q(c_girl_num__gt=80))
    # 男生大於 90 且 女生大於 80 的公司名稱
    for company in companies:
        # 進行遍歷後查看公司名
        print(company.c_name)
    return HttpResponse("獲取成功")

注:
且  :  Q(條件) & Q(條件) 
取反 : ~Q  表示取反
或 :  Q(條件) | Q(條件)

Django學習路19_is_delete屬性,重寫類方法,顯性隱性屬性
若是在 建立數據表時,使用了 
objects =  models.Model() 
使隱形屬性變爲了 顯性屬性 
則 必需要本身定義一個 
    繼承了 models.Model 類的類,實現 管理功能

若是一個屬性一直都須要使用 
好比 is_delete 屬性,判斷 這條數據是否刪除
is_delete 爲 True 也就是 1 時,則表示刪除了
刪除了就不該該在數據庫表中再次使用了
models.py 中新添加的數據表,及其繼承類

class AnimalManage(models.Manager):
    # 父類先聲明,繼承的是 models.Manager 類,須要重寫 filter 方法
    '''使用繼承,重寫原來類的方法,進行改進函數時,考慮類的繼承'''
    def get_queryset(self):
        '''使 filter 自動具備保留 is_delete 爲 0 的功能,is_delete 爲 1 的自動過濾掉'''
        # return super(AnimalManage,self).get_queryset()
        # 對父類的方法進行修改,將 is_delete 爲 0 的留下
        return super(AnimalManage,self).get_queryset().filter(is_delete = False)

    def create(self,a_name = "Pandas"):
        # 默認建立一個熊貓
        '''改寫建立對象語句,使用子類完成操做'''
        animal = self.model()
        # 建立一個模型
        animal.a_name = a_name
        return animal


class Animal(models.Model):
    # 建立一個數據表爲 Animal
    a_name = models.CharField(max_length=16)
    # 動物名字
    is_delete = models.BooleanField(default=False)
    # 設置是否刪除數據,默認不刪除,數據庫中表示爲 0

    objects = AnimalManage()
    # 設置管理者,objects 是什麼名字
    # 類名.定義的名字.all()

添加到數據庫表中的數據

其中 is_delete 爲 1 的表示已經刪除的數據

is_delete 是須要的數據

在 urls.py 中添加參數

url(r'getanimals',views.getanimals)

在 views.py 中添加 views. 後面的函數名

def getanimals(request):
    animals = Animal.objects.all()
    # 這裏使用的是子類的實例化對象 objects
    context = {
        'animals':animals
    }
    '''
    animal = Animal.objects.create('動物名稱')
    使用 子類中定義的方法進行建立
    '''

    return render(request,'Animals.html',context=context)

在 templates 中建立 render 函數中的 'xxx.html' 文件
此處 個人是 Animals.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>動物</title>
</head>
<body>
    <h2>動物列表</h2>
    <ul>
        {% for animal in animals %}
        <li>{{ animal.a_name }}</li>
        {% endfor %}
    </ul>
</body>
</html>

is_delete 爲 1 的過濾掉了, 爲 0 的保存了下來

Django學習路20_流程複習
https://www.cnblogs.com/hany-postq473111315/p/12881490.html

Django學習路21_views函數中定義字典及html中使用類實例對象的屬性及方法
建立 app6  在項目的 settings 中進行註冊
INSTALLED_APPS 裏面添加 'app6.apps.App6Config'

在 app6 的models.py 中建立數據表

class Student(models.Model):
    s_name = models.CharField(max_length= 16)

進行遷移
python manage.py makemigrations 
python manage.py migrate 

在 views 中添加函數
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from app6.models import Student


def hello(request):
    return HttpResponse("你好")

def index(request):
    # render 實質上也是返回 HttpResponse ,render 幫助把模板和context數據渲染成字符串
    '''
    temp = loader.get_template('index6.html')
    content = temp.render()
    return HttpResponse(content)
    二者等價
    return render(request,'index6.html')
    '''

    return render(request,'index6.html')

def getstudents(request):

    students = Student.objects.all()
    stu_data = {
        'students':students
    }
    return render(request,'students.html',context=stu_data)
注:
見名知意便可

在 urls.py 中添加
from django.conf.urls import url

from app6 import views

urlpatterns = [
    url(r'hello',views.hello),
    url(r'index',views.index),
    url(r'getstudents',views.getstudents)
]

建立 templates 文件夾,添加 students.html 對數據進行遍歷
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>
    {% for stu in students %}
    <li> {{ stu.s_name }}</li>
    {% endfor %}
</h3>
</body>
</html

進階內容 使用 變量

def getstudents(request):

    students = Student.objects.all()
    stu_dict = {
    #     本身定義的字典
        'hobby':'play',
        'time':'5 years'
    }

    stu_data = {
        'students':students,
        'stu_dict':stu_dict
    #     stu_dict 是本身定義的字典
    }


    return render(request,'students.html',context=stu_data)






students_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    {% for stu in students %}
    <li> {{ stu.s_name }}</li>
    {% endfor %}
    <hr/><br/><br/>


    <li> {{ students.0.s_name }}</li>
{#      0   輸出第一個數據 #}

    <hr/><br/><br/>

    {% for stu in students %}
    <li> {{ stu.get_name }}</li>
{#    此處使用的是類中定義的方法#}
    {% endfor %}

    <h3>{{ stu_dict.hobby }}</h3>
{#stu_dict 是本身建立的字典類型,使用的 hobby 是本身添加的鍵值#}
</ul>
</body>
</html>

注:
stu.s_name  遍歷的對象獲取名字
students.0.s_name 獲取第一條數據的名字
stu.get_name 使用類內的方法獲取姓名

    def get_name(self):
        # 使用類內定義的函數獲取名字
        return self.s_name

stu_dict.hobby 使用自定義的字典元素
注: 須要寫到 context 內部的 鍵中
    stu_dict = {
    #     本身定義的字典
        'hobby':'play',
        'time':'5 years'
    }

    stu_data = {
        'students':students,
        'stu_dict':stu_dict
    #     stu_dict 是本身定義的字典
    }

Django學習路22_empty爲空,forloop.counter 從1計數,.counter0 從0計數 .revcounter最後末尾數字是1,.revcounter0 倒序,末尾爲 0
當查找的數據不存在,返回爲 空時
在 html 中使用 {%empty%} 語句  進行顯示
def getstudents(request):

    students = Student.objects.all().filter(s_name = 'qwer')
    # 指定一個不存在的值,
    # students = Student.objects.all()
    stu_dict = {
    #     本身定義的字典
        'hobby':'play',
        'time':'5 years'
    }

    stu_data = {
        'students':students,
        'stu_dict':stu_dict
    #     stu_dict 是本身定義的字典
    }

    return render(request,'students.html',context=stu_data)

html 中語句

    {% for stu in students %}
    <li> {{ stu.s_name }}</li>
        {% empty %}
        <h3>不存在該學生</h3>
    {% endfor %}
    <hr/><br/><br/>注: 若是爲 空,則輸出 <h3> 不存在該學生</h3> 這條語句

def getstudents(request):

    students = Student.objects.all()
    # 指定一個不存在的值,
    # students = Student.objects.all()
    stu_dict = {
    #     本身定義的字典
        'hobby':'play',
        'time':'5 years'
    }

    stu_data = {
        'students':students,
        'stu_dict':stu_dict
    #     stu_dict 是本身定義的字典
    }

    return render(request,'students.html',context=stu_data)

forloop.counter 示例

    {% for stu in students %}
    <li> {{ forloop.counter }} : {{ stu.s_name }}</li>
    {% endfor %}

forloop.counter0 示例

    {% for stu in students %}
    <li> {{ forloop.counter0 }} : {{ stu.s_name }}</li>
    {% endfor %}

forloop.revcounter 示例


    {% for stu in students %}
    <li> {{ forloop.revcounter }} : {{ stu.s_name }}</li>
    {% endfor %}

forloop.revcounter0 示例


    {% for stu in students %}
    <li> {{ forloop.revcounter0 }} : {{ stu.s_name }}</li>
    {% endfor %}

Django學習路23_if else 語句,if elif else 語句 forloop.first第一個元素 .last最後一個元素,註釋
if else 格式

{%  if  條件 %}
<標籤>語句</標籤>
{%else%}
<標籤>語句</標籤>
{%endif}
標籤均可以添加樣式
{% for stu in students %}
    {% if forloop.first %}
        <li style="color: chartreuse">{{ stu.s_name }}</li>
        {% else %}
        <li>{{ stu.s_name }}</li>
    {% endfor %}

forloop.first 表示是不是第一個
color: chartreuse 淺綠色
for 循環和 if 判斷 最後都要加上 endfor 和 endif
if elif else 格式

{%  if  條件 %}
<標籤>語句</標籤>
{%elif 條件 %}
<標籤>語句</標籤>
{%else %}
<標籤>語句</標籤>
{%endif}

{% for stu in students %}
    {% if forloop.first %}
        <li style="color: chartreuse">{{ stu.s_name }}</li>
        {% elif forloop.last %}
        <li style="color: blue">{{ stu.s_name }}</li>
        {% else %}
        <li>{{ stu.s_name }}</li>
        {% endif %}
    {% endfor %}

{#註釋內容:  #}

{%comment%}

註釋內容:

{%endcomment%}

Django學習路24_乘法和除法

urls 中
url(r'getnum',views.getnum)
views.py 中添加對應的函數

def getnum(request):
    num = 5
    context_num = {
        'num':num
    }
    return render(request,'num_ys.html',context=context_num)

html 中代碼

<body>
{# 乘法 #}
<h2> {{num}} 當前的值</h2>
<h3>進行運算後的值 : {% widthratio num 1 5  %}</h3>

{# 除法 #}
<h2> {{num}} 當前的值</h2>
<h3>進行運算後的值 : {% widthratio num 5 1 %}</h3>

</body>

{%widthratio 數 分母 分子 %}

Django學習路25_ifequal 和 ifnotequal 判斷數值是否相等及加減法 {{數值|add 數值}}
{% ifequal 數值 數值 %}

<body>
{# 判斷是否相等 #}
num 當前的值 {{ num }}<br/>
{% ifequal num 5 %}
{# 判斷 num 是否等於 5#}
    num 的值是 5
{% endifequal %}

</body>

{% ifnotequal 數值 數值 %}
{% ifnotequal%}


num 當前的值 {{ num }}<br/>
{% ifnotequal num 6 %}
{# 判斷 num 是否等於 5#}
    num 的值不是 6
{% endifnotequal %}

{{ 數值 | add: 數值}}

{# 加法 #}
num 當前的值 {{ num }}<br/>
num + 5 的值是 :{{ num | add:5 }}

{{數值 | add:-數值}}

{# 減法 #}
num 當前的值 {{ num }}<br/>
num - 2 的值是 :{{ num | add:-2 }}
Django學習路26_轉換字符串大小寫 upper,lower
在 urls 中註冊
url(r'getstr',views.getstr)

在 views.py 中添加函數

def getstr(request):    string = 'abc'    string_2 = 'ABC'    context_str = {        'string':string,        'string_2':'ABC'    }    return render(request,'strs.html',context=context_str)
{{ 字符串 | upper}}

<body>
當前的字符串爲 {{ string }}<br/>
字符串大寫後爲 {{ string | upper }}
</body>

{{字符串|lower}}

<body>
當前的字符串爲 {{ string_2 }}<br/>
字符串小寫後爲 {{ string_2 | lower }}
</body>

Django學習路27_HTML轉義

謹慎使用
自動渲染語法
{{code|safe}}

urls.py 中添加對應的函數

url(r'getcode',views.getcode)
在 views.py 中添加

def getcode(request):
    code = "<h2> HTML 轉義示例 </h2>"
    context_code = {
        'code':code
    }
    return render(request,'getcode.html',context=context_code)
getcode.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Getcode 示例</title>
</head>
<body>
<p>
    {{ code|safe }}
</p>
</body>
</html>
網站注入 js ,除非數據絕對安全,不然不要使用 
{{code|safe}}

在 根目錄下,建立靜態文件夾, static

創建 JavaScript 文件
添加內容
alert("網站被攻陷~"); 
在 views.py 中添加

def getcode(request):
    code = """
    <h2> HTML 轉義示例 </h2>
    
    <script type="text/javascript">
        alert("網站被攻陷了~");
    </script>
    """

    context_code = {
        'code':code
    }
    return render(request,'getcode.html',context=context_code)

在 html 數據中添加

{{code|safe}} 

code 爲傳遞過來的參數

裏面有外界注入的 js 代碼
進行自動渲染
autoescape off
不進行自動渲染
autoescape on


<body>
    {% autoescape on %}
        {{ code }}
    {% endautoescape %}
</body>

Django學習路28_ .html 文件繼承及<block 標籤>,include 'xxx.html'
在 templates 文件夾下建立 基類 base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
{% block header %}

{% endblock %}

{% block banner %}

{% endblock %}

{% block content %}

{% endblock %}

{% block footer %}

{% endblock %}
</body>
</html>

繼承 base.html ,子類名爲 home.html 

{% extends 'base.html' %}
{#繼承 base.html #}

{% block header %}
<h2> header 模塊 第一次繼承 .html 文件</h2>
{% endblock %}

此時,繼承的子類就能夠顯示

在 urls.py 中添加 
url(r'temp',views.temp),

在 views.py 中添加對應的函數

def temp(request):

    return render(request,'home.html',context={'title':'home'})

使用子類footer 繼承 剛剛繼承的 home.html

base   -> home  -> footer

footer.html 
{% extends '名稱.html'%}
{% block 名稱%}
語句
{%endblock%}


{% extends 'home.html' %}

{% block footer %}

    <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3>
{% endblock %}

在 urls.py 中進行註冊

url(r'footer',views.footer)

在 views.py 中添加 footer 函數

def footer(request):

    return render(request,'footer.html',context={'title':'footer'})

子類繼承時,父類中顯示的東西也會顯示出來
子類能夠繼承父類的 block 塊
使用 extends
語法:{% extends '名稱.html'%}

當繼承同一個 block 下的標籤時,可能會出現覆蓋
須要使用 {{block.super}}

footer.html 內容

{% extends 'home.html' %}

{% block footer %}

    <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3>
{% endblock %}


{% block header %}

    繼承了 子類 home 的 類,顯示塊爲 header
{% endblock %}

注:
在 繼承的 home.html 中也存在 block header 標籤,若是沒有使用 super 方法,會出現覆蓋,使用子類的方法

使用 super 後,顯示父類中的 block header

{% extends 'home.html' %}

{% block footer %}

    <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3>
{% endblock %}


{% block header %}
    {{ block.super }}
    繼承了 子類 home 的 類,顯示塊爲 header
{% endblock %}

{% include '名稱.html'%}
速度慢.

{% block footer %}
{% include 'footer.html' %}

{% endblock %}

注:
使用 footer.html 的內容

 

 


 

Django學習路29_css樣式渲染 h3 標籤
在 static 靜態文件夾下建立 css 文件夾 home.css 
此時 home.css 路徑是 'static/css/home.css'

在 對應的 home.html 文件中添加 css 樣式

{% block ext_css %}
{#    <link rel="stylesheet" href="/static/css/home.css">#}
{#    導入樣式#}
    <link rel="stylesheet" href="{% static 'css/home.css' %}"
{#       使用相對路徑#}
{% endblock %}

注:
導入方式:
 <link rel="stylesheet" href="/static/css/home.css">
使用絕對路徑,若是路徑修改,則很容易出錯

<link rel="stylesheet" href="{% static 'css/home.css' %}"
使用相對路徑,在使用以前,要先在項目的 settings 中添加

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
]
通知項目,存在該目錄
home.html 內容

{% extends 'base.html' %}
{#繼承 base.html #}
{% load static %}
{% block header %}
<h2> header 模塊 第一次繼承 .html 文件</h2>
{% endblock %}

{% block footer %}
{% include 'footer.html' %}

{% endblock %}

{% block ext_css %}
{#    <link rel="stylesheet" href="/static/css/home.css">#}
{#    導入樣式#}
    <link rel="stylesheet" href="{% static 'css/home.css' %}"
{#       使用相對路徑#}
{% endblock %}
home.css 內容
標籤名{
  屬性:值;    
}

h3{
    color:green;
}
本次使用的是 footer.html  繼承了 home.html 的子類

footer.html 內容

{% extends 'home.html' %}

{% block footer %}

    <h3> 繼承了 子類 home 的 類,顯示塊爲 footer </h3>
{% endblock %}


{% block header %}
    {{ block.super }}
    繼承了 子類 home 的 類,顯示塊爲 header
{% endblock %}


{% block content %}
    <h3>作一件事,就把這件事作好</h3>

{% endblock %}
在 urls 中註冊

 url(r'footer',views.footer)

在 views 中實現

def footer(request):

    return render(request,'footer.html',context={'title':'footer'})
注:
在 settings 中的 
DEBUG = True

當 DEBUG 爲 False 時,會發生界面找不到

核心語句寫法:

導入:
<link rel = "stylesheet" href = "{%static '相對路徑'%}">

 <link rel="stylesheet" href="{% static 'css/home.css' %}"


繼承:
{% extends '文件名.html'%}

{% extends 'base.html' %}
{% extends 'home.html' %}

css 樣式:
標籤名{
  屬性:值;
}

h3{
    color:green;
}

千萬要進行註冊

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
]

Django學習路30_view中存在重複名時,取第一個知足條件的
在 settings 中添加 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app.apps.AppConfig'
]

在 urls 中添加 對應的函數

from django.conf.urls import url

from app import views

urlpatterns = [
    url(r'getok',views.getok),
    url(r'getokok',views.getokok)
]

注:
使用 url  不使用 path
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
def getok(request):
    return HttpResponse("您獲得的回覆是 OK ")

def getokok(request):
    return HttpResponse("您獲得的回覆是 OKOK  ")

Django學習路31_使用 locals 簡化 context 寫法,點擊班級顯示該班學生信息
urls 中 進行註冊

url(r'grades',views.grades)

views 中編寫函數

def grades(request):
    grades_list = Grade.objects.all()
    # 使用 locals 獲取本地變量
    return render(request,'grades_list.html',context = locals())
html 中編寫頁面顯示

<body>
<h2>班級列表</h2>
<ul>
    {% for grade in grades_list %}
    <li> {{ grade.g_name }}</li>
    {% endfor %}
</ul>
</body>

render 參數寫爲 context = locals()

點擊班級名,跳轉查看全部學生信息

在 html 循環中使用 

<a href = "函數名/{{grade.g_id}}">班級名稱</a>


在 urls 中聲明 "顯示名稱/(\d+)/" 
(\d+)  返回到函數中一個參數,經過參數能夠獲取到學生的信息

類名.objects.filter 內參數 s_grade_id = g_id
Django學習路32_建立管理員及內容補充+前面內容複習
建立管理員

python manage.py createsuperuser

 

 

 

 

 

 

數據庫屬性命名限制

1.不能是python的保留關鍵字
2.不容許使用連續的下劃線,這是由django的查詢方式決定的
3.定義屬性時須要指定字段類型,經過字段類型的參數指定選項
語法以下:
屬性名=models.字段類型(選項)
字段類型
使用時須要引入django.db.models包,字段類型以下:
AutoField:自動增加的IntegerField,一般不用指定,不指定時Django會自動建立屬性名爲id的自動增加屬性

BooleanField:布爾字段,值爲True或False

NullBooleanField:支持Null、True、False三種值

CharField(max_length=字符長度):字符串
參數max_length表示最大字符個數

TextField:大文本字段,通常超過4000個字符時使用

IntegerField:整數

DecimalField(max_digits=None, decimal_places=None):十進制浮點數

參數max_digits表示總位數

參數decimal_places表示小數位數

FloatField:浮點數

DateField:[auto_now=False, auto_now_add=False]):日期
參數auto_now表示每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,它老是使用當前日期,默認爲false。
參數auto_now_add表示當對象第一次被建立時自動設置當前時間,用於建立的時間戳,它老是使用當前日期,默認爲false

參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤

TimeField:時間,參數同DateField

DateTimeField:日期時間,參數同DateField

FileField:上傳文件字段

ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片

選項:

null:若是爲True,表示容許爲空,默認值是False

blank:若是爲True,則該字段容許爲空白,默認值是False

對比:null是數據庫範疇的概念,blank是表單驗證證範疇的

db_column:字段的名稱,若是未指定,則使用屬性的名稱

db_index:若值爲True, 則在表中會爲此字段建立索引,默認值是False

default:默認值

primary_key:若爲True,則該字段會成爲模型的主鍵字段,默認值是False,通常做爲AutoField的選項使用

unique:若是爲True, 這個字段在表中必須有惟一值,默認值是False。

get() 獲取數據的坑
注:以前寫過


get():返回表中知足條件的一條且只能有一條數據

若是查到多條數據,則拋異常:MultipleObjectsReturned

查詢不到數據,則拋異常:DoesNotExist

判斷條件中的 屬性列__參數 的補充

1.判等 exact

例:查詢編號爲1的圖書
BookInfo.objects.get(id=1)
BookInfo.objects.get(id__exact=1)


2.模糊查詢 contains

例:查詢書名包含''的圖書。contains

BookInfo.objects.filter(btitle__contains='')
例:查詢書名以''結尾的圖書 endswith 開頭:startswith
BookInfo.objects.filter(btitle__endswith='')

3.空查詢 isnull 

select * from booktest_bookinfo where title is not null;

例:查詢書名不爲空的圖書。isnull 
BookInfo.objects.filter(btitle__isnull=False)

4.範圍查詢 in 

select * from booktest_bookinfo where id in (1,3,5)
例:查詢編號爲1或3或5的圖書。
BookInfo.objects.filter(id__in = [1,3,5])

5.比較查詢 
gt 大於
lt 小於 
gte 大於等於
lte 小於等於

例:查詢編號大於3的圖書。
BookInfo.objects.filter(id__gt = 3)

6.日期查詢 year

例:查詢1980年發表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1往後發表的圖書。
from datetime import date
BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))

7.返回不知足條件的數據 exclude

例:查詢id不爲3的圖書信息。
BookInfo.objects.exclude(id=3)
F對象
做用:用於類屬性之間的比較條件

使用以前須要先導入:
from django.db.models import F

例:查詢圖書閱讀量大於評論量圖書信息。
BookInfo.objects.filter(bread__gt = F('bcomment'))

例:查詢圖書閱讀量大於2倍評論量圖書信息。
BookInfo.objects.filter(bread__gt = F('bcomment')*2)



Q對象
做用:用於查詢時的邏輯條件
not and or,能夠對Q對象進行&|~操做

使用以前須要先導入:
from django.db.models import Q

例:查詢id大於3且閱讀量大於30的圖書的信息。
BookInfo.objects.filter(id__gt=3, bread__gt=30)

BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查詢id大於3或者閱讀量大於30的圖書的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查詢id不等於3圖書的信息。
BookInfo.objects.filter(~Q(id=3))

order_by 
QuerySet對象.order_by('屬性')

做用:進行查詢結果進行排序


例:查詢全部圖書的信息,按照id從小到大進行排序
BookInfo.objects.all().order_by('id')
BookInfo.objects.order_by('id')

例:查詢全部圖書的信息,按照id從大到小進行排序。
BookInfo.objects.all().order_by('-id')

例:把id大於3的圖書信息按閱讀量從大到小排序顯示;
BookInfo.objects.filter(id__gt=3).order_by('-bread')

注:
屬性上寫上 - 號,表示從大到小進行排序

聚合函數
Sum Count Max Min Avg

aggregate(聚合函數('屬性'))
返回一個字典對象

使用前需先導入聚合類: 
from django.db.models import Sum,Count,Max,Min,Avg

例:查詢全部圖書的數目 Count
BookInfo.objects.aggregate(Count('id'))
返回值類型:
{'id__count': 5}

例:查詢全部圖書閱讀量的總和。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}

count函數 返回值是一個數字
做用:統計知足條件數據的數目

例:統計全部圖書的數目。
BookInfo.objects.count()
例:統計id大於3的全部圖書的數目
BookInfo.objects.filter(id__gt=3).count()


查詢相關函數返回值總結:
get:返回一個對象 
all:QuerySet 返回全部數據
filter:QuerySet 返回知足條件的數據
exclude:QuerySet 返回不滿條件的數據
order_by:QuerySet 對查詢結果進行排序
aggregate:字典 進行聚合操做
count:數字 返回查詢集中數據的數目
get,filter,exclude參數中能夠寫查詢條件。

查詢集特性:
1.惰性查詢:
只有在實際使用查詢集中的數據的時候纔會發生對數據庫的真正查詢

2.緩存:
當使用的是同一個查詢集時,第一次的時候會發生實際數據庫的查詢,而後把結果緩存起來,以後再使用這個查詢集時,使用的是緩存中的結果

限制查詢集:
能夠對一個查詢集進行取下標或者切片操做來限制查詢集的結果
b[0]就是取出查詢集的第一條數據
b[0:1].get()也可取出查詢集的第一條數據

若是b[0]不存在,會拋出IndexError異常

若是b[0:1].get()不存在,會拋出DoesNotExist異常。多條時拋MultiObjectsReturned
對一個查詢集進行切片操做會產生一個新的查詢集,下標不容許爲負數

exists:判斷一個查詢集中是否有數據  True False

模型類關係
1.一對多關係
例:圖書類-英雄類 
models.ForeignKey() 定義在多的類中

2.多對多關係
例:新聞類-新聞類型類 體育新聞 國際
models.ManyToManyField() 定義在哪一個類中均可以

3.一對一關係
例:員工基本信息類-員工詳細信息類. 員工工號
models.OneToOneField定義在哪一個類中均可以

關聯查詢(一對多)
在一對多關係中,一對應的類咱們把它叫作一類,多對應的那個類咱們把它叫作多類,咱們把多類中定義的創建關聯的類屬性叫作關聯屬性

例:查詢圖書id爲1的全部英雄的信息。
    book = BookInfo.objects.get(id=1)
    book.heroinfo_set.all()

經過模型類查詢:
    HeroInfo.objects.filter(hbook_id=1)
例:查詢id爲1的英雄所屬圖書信息。
    hero =HeroInfo.objects.get(id=1)
    hero.hbook

經過模型類查詢:
BookInfo.objects.filter(heroinfo__id=1)

由一類的對象查詢多類的時候:
    一類的對象.多類名小寫_set.all() #查詢所用數據
由多類的對象查詢一類的時候:
    多類的對象.關聯屬性  #查詢多類的對象對應的一類的對象
由多類的對象查詢一類對象的id時候:
    多類的對象. 關聯屬性_id

經過模型類實現關聯查詢:

例:查詢圖書信息,要求圖書中英雄的描述包含''
BookInfo.objects.filter(heroinfo__hcomment__contains='')

例:查詢圖書信息,要求圖書中的英雄的id大於3
BookInfo.objects.filter(heroinfo__id__gt=3)

例:查詢書名爲「天龍八部」的全部英雄
HeroInfo.objects.filter(hbook__btitle='天龍八部')

經過多類的條件查詢一類的數據:
    一類名.objects.filter(多類名小寫__多類屬性名__條件名) 

經過一類的條件查詢多類的數據:
    多類名.objects.filter(關聯屬性__一類屬性名__條件名)
插入、更新和刪除

調用模型類對象的save方法實現對模型類對應數據表的插入和更新
調用模型類對象的delete方法實現對模型類對應數據表數據的刪除

自關聯是一種特殊的一對多關係
管理器
objects
BookInfo.objects.all()
答:objects是Django幫我自動生成的管理器對象
    經過這個管理器能夠實現對數據的查詢
objects是models.Manger類的一個對象
自定義管理器後 Django再也不幫咱們生成默認的objects管理器

1.自定義一個管理器類,這個類繼承models.Manger類
2.再在具體的模型類裏定義一個自定義管理器類的對象

自定義管理器類的應用場景:
1.改變查詢的結果集
好比調用BookInfo.books.all()返回的是沒有刪除的圖書的數據
2.添加額外的方法
管理器類中定義一個方法幫咱們建立對應的模型類對象
使用self.model()就能夠建立一個跟自定義管理器對應的模型類對象

元選項

Django默認生成的表名:
    應用名小寫_模型類名小寫。
元選項:
須要在模型類中定義一個元類Meta
在裏面定義一個類屬性db_table就能夠指定表名

Django學習路33_url 地址及刪除元素 delete() 和重定向 return redirect('路徑')
保存日期

def create(request):
    '''新增一本圖書'''
    # 1.建立BookInfo對象
    b = BookInfo()
    b.btitle = '流星蝴蝶劍'
    b.bpub_date = date(1990,1,1)
    # 2.保存進數據庫
    b.save()
    # 3.返回應答,讓瀏覽器再訪問/index,重定向
    return HttpResponse('ok')
    # return HttpResponseRedirect('/index')
    # return redirect('/index')

使用 結果集對象.delete()  進行刪除

from django.shortcuts import render,redirect # 導入重定向函數
redirect('路徑') 實現重定向


def delete(request, bid):
    '''刪除點擊的圖書'''
    # 1.經過bid獲取圖書對象
    book = BookInfo.objects.get(id=bid)
    # 2.刪除
    book.delete()
    # 3.重定向,讓瀏覽器訪問/index
    # return HttpResponseRedirect('/index')
    return redirect('/index')

Django學習路34_models 文件建立數據表
from django.db import models

# Create your models here.
class BookInfoManager(models.Manager):
    '''圖書模型管理器類'''
    # 1.改變原有查詢的結果集
    def all(self):
        # 1.調用父類的all方法,獲取全部數據
        books = super().all() # QuerySet
        # 2.對books中的數據進行過濾
        books = books.filter(isDelete=False)
        # 返回books
        return books

    # 2.封裝方法,操做模型類對應的數據表(增刪改查)
    def create_book(self, btitle, bpub_date):
        '''添加一本圖書'''
        # 1.建立一個圖書對象
        # 獲取self所在的模型類
        model_class = self.model
        book = model_class()
        # book = BookInfo()
        book.btitle = btitle
        book.bpub_date = bpub_date
        # 2.添加進數據庫
        book.save()
        # 3.返回book
        return book


# 一類
# booktest2_bookinfo
class BookInfo(models.Model):
    '''圖書模型類'''
    # 圖書名稱
    btitle = models.CharField(max_length=20, db_column='title')
    # 圖書名字惟一
    # btitle = models.CharField(max_length=20, unique=True, db_index=True)
    # 價格,最大位數爲10,小數爲2
    # bprice = models.DecimalField(max_digits=10, decimal_places=2)
    # 出版日期
    bpub_date = models.DateField()
    # bpub_date = models.DateField(auto_now_add=True) # 建立時間
    # bpub_date = models.DateField(auto_now=True) # 更新時間
    # 閱讀量
    bread = models.IntegerField(default=0)
    # 評論量
    bcomment = models.IntegerField(default=0)
    # 刪除標記
    isDelete = models.BooleanField(default=False)

    # book = models.Manager() # 自定一個Manager類對象,管理器對象
    objects = BookInfoManager() # 自定義一個BookInfoManager類的對象

    # @classmethod
    # def create_book(cls, btitle, bpub_date):
    #     '''添加一本圖書'''
    #     # 建立一個cls類的對象
    #     obj = cls()
    #     obj.btitle = btitle
    #     obj.bpub_date = bpub_date
    #     # 添加進數據庫
    #     obj.save()
    #     # 返回obj
    #     return obj

    class Meta:
        db_table = 'bookinfo' # 指定模型類對應表名



# 多類
class HeroInfo(models.Model):
    '''英雄人物模型類'''
    # 英雄名
    hname = models.CharField(max_length=20)
    # 性別
    hgender = models.BooleanField(default=False)
    # 備註
    hcomment = models.CharField(max_length=200, null=True, blank=False)
    # 關係屬性
    hbook = models.ForeignKey('BookInfo',on_delete=True)
    # 刪除標記
    isDelete = models.BooleanField(default=False)
'''
# 新聞類型類
class NewsType(models.Model):
    # 類型名
    type_name = models.CharField(max_length=20)
    # 關係屬性,表明類型下面的信息
    type_news = models.ManyToManyField('NewsInfo')

# 新聞類
class NewsInfo(models.Model):
    # 新聞標題
    title = models.CharField(max_length=128)
    # 發佈時間
    pub_date = models.DateTimeField(auto_now_add=True)
    # 信息內容
    content = models.TextField()
    # 關係屬性, 表明信息所屬的類型
    # news_type = models.ManyToManyField('NewsType')

# 員工基本信息類
class EmployeeBasicInfo(models.Model):
    # 姓名
    name = models.CharField(max_length=20)
    # 性別
    gender = models.BooleanField(default=False)
    # 年齡
    age = models.IntegerField()
    # 關係屬性,表明員工的詳細信息
    employee_detail = models.OneToOneField('EmployeeDetailInfo')

# 員工詳細信息類
class EmployeeDetailInfo(models.Model):
    # 聯繫地址
    addr = models.CharField(max_length=256)
    # 教育經歷
    # 關係屬性,表明員工基本信息
    # employee_basic = models.OneToOneField('EmployeeBasicInfo')
'''

class AreaInfo(models.Model):
    '''地區模型類'''
    # 地區名稱
    atitle = models.CharField(max_length=20)
    # 關係屬性,表明當前地區的父級地區
    aParent = models.ForeignKey('self', null=True, blank=True,on_delete=True)

    # class Meta:
    #     db_table = 'areas'

Django學習路35_視圖使用方法(複製的代碼) + 簡單總結
from django.shortcuts import render,redirect
from django.http import HttpResponse,JsonResponse
from datetime import datetime,timedelta
# Create your views here.


# request就是HttpRequest類型的對象
# request包含瀏覽器請求的信息
def index(request):
    '''首頁'''
    # num = 'a' + 1
    # print(request.path)
    response = render(request, 'booktest/index.html')
    response.write('hello')
    return response


def show_arg(request, num):
    return HttpResponse(num)


def login(request):
    '''顯示登陸頁面'''
    # 判斷用戶是否登陸
    if request.session.has_key('islogin'):
        # 用戶已登陸, 跳轉到首頁
        return redirect('/index')
    else:
        # 用戶未登陸
        # 獲取cookie username
        if 'username' in request.COOKIES:
            # 獲取記住的用戶名
            username = request.COOKIES['username']
        else:
            username = ''

        return render(request, 'booktest/login.html', {'username':username})


def login_check(request):
    '''登陸校驗視圖'''
    # request.POST 保存的是post方式提交的參數 QueryDict
    # request.GET 保存是get方式提交的參數
    print(request.method)
    # 1.獲取提交的用戶名和密碼
    username = request.POST.get('username')
    password = request.POST.get('password')
    remember = request.POST.get('remember')
    # 2.進行登陸的校驗
    # 實際開發:根據用戶名和密碼查找數據庫
    # 模擬: smart 123
    if username == 'smart' and password == '123':
        # 用戶名密碼正確,跳轉到首頁
        response = redirect('/index')

        # 判斷是否須要記住用戶名
        if remember == 'on':
            # 設置cookie username,過時時間1周
            response.set_cookie('username', username, max_age=7*24*3600)

        # 記住用戶登陸狀態
        # 只有session中有islogin,就認爲用戶已登陸
        request.session['islogin'] = True

        # 返回應答
        return response
    else:
        # 用戶名或密碼錯誤,跳轉到登陸頁面
        return redirect('/login')


# /test_ajax
def ajax_test(request):
    '''顯示ajax頁面'''
    return render(request, 'booktest/test_ajax.html')


def ajax_handle(request):
    '''ajax請求處理'''
    # 返回的json數據 {'res':1}
    return JsonResponse({'res':1})


# /login_ajax
def login_ajax(request):
    '''顯示ajax登陸頁面'''
    return render(request, 'booktest/login_ajax.html')


# /login_ajax_check
def login_ajax_check(request):
    '''ajax登陸校驗'''
    # 1.獲取用戶名和密碼
    username = request.POST.get('username')
    password = request.POST.get('password')

    # 2.進行校驗,返回json數據
    if username == 'smart' and password == '123':
        # 用戶名密碼正確
        return JsonResponse({'res':1})
        # return redirect('/index') ajax請求在後臺,不要返回頁面或者重定向
    else:
        # 用戶名或密碼錯誤
        return JsonResponse({'res':0})


# /set_cookie
def set_cookie(request):
    '''設置cookie信息'''
    response = HttpResponse('設置cookie')
    # 設置一個cookie信息,名字爲num, 值爲1
    response.set_cookie('num', 1, max_age=14*24*3600)
    # response.set_cookie('num2', 2)
    # response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))
    # 返回response
    return response


# /get_cookie
def get_cookie(request):
    '''獲取cookie的信息'''
    # 取出cookie num的值
    num = request.COOKIES['num']
    return HttpResponse(num)


# /set_session
def set_session(request):
    '''設置session'''
    request.session['username'] = 'smart'
    request.session['age'] = 18
    # request.session.set_expiry(5)
    return HttpResponse('設置session')


# /get_session
def get_session(request):
    '''獲取session'''
    username = request.session['username']
    age = request.session['age']
    return HttpResponse(username+':'+str(age))


# /clear_session
def clear_session(request):
    '''清除session信息'''
    # request.session.clear()
    request.session.flush()
    return HttpResponse('清除成功')
urls.py 內容

from django.conf.urls import url
from booktest import views

urlpatterns = [
    url(r'^index$', views.index), # 首頁
    # url(r'^showarg(\d+)$', views.show_arg), # 捕獲url參數:位置參數
    url(r'^showarg(?P<num>\d+)$', views.show_arg),# 捕獲url參數:關鍵字參數

    url(r'^login$', views.login), # 顯示登陸頁面
    url(r'^login_check$', views.login_check), # 用戶登陸校驗

    url(r'^test_ajax$', views.ajax_test), # 顯示ajax頁面
    url(r'^ajax_handle$', views.ajax_handle), # ajax處理

    url(r'^login_ajax$', views.login_ajax), # 顯示ajax登陸頁面
    url(r'^login_ajax_check$', views.login_ajax_check), # ajax登陸校驗

    url(r'^set_cookie$', views.set_cookie), # 設置cookie
    url(r'^get_cookie$', views.get_cookie), # 獲取cookie

    url(r'^set_session$', views.set_session), # 設置session
    url(r'^get_session$', views.get_session), # 獲取session
    url(r'^clear_session$', views.clear_session), # 清除session
]

展現參數

def show_arg(request, num):
    return HttpResponse(num)


判斷用戶是否登陸

request.session.has_key('islogin')

重定向

return redirect('/index')

獲取cookie

request.COOKIES


獲取用戶提交的用戶名和密碼

username = request.POST.get('username')
password = request.POST.get('password')

判斷是否須要記住

remember = request.POST.get('remember')
        if remember == 'on':
            # 設置cookie username,過時時間1周
            response.set_cookie('username', username, max_age=7*24*3600)


只要 session中有islogin,就認爲用戶已登陸

request.session['islogin'] = True

返回 JSON 數據

def ajax_handle(request):
    '''ajax請求處理'''
    # 返回的json數據 {'res':1}
    return JsonResponse({'res':1})

判斷是否登陸

def login_ajax_check(request):
    '''ajax登陸校驗'''
    # 1.獲取用戶名和密碼
    username = request.POST.get('username')
    password = request.POST.get('password')

    # 2.進行校驗,返回json數據
    if username == 'smart' and password == '123':
        # 用戶名密碼正確
        return JsonResponse({'res':1})
        # return redirect('/index') ajax請求在後臺,不要返回頁面或者重定向
    else:
        # 用戶名或密碼錯誤
        return JsonResponse({'res':0})


設置 cookie 信息

response.set_cookie('num', 1, max_age=14*24*3600)

獲取 cookie 信息

num = request.COOKIES['num']

設置 session 信息
request.session['username'] = 'smart'


def set_session(request):
    '''設置session'''
    request.session['username'] = 'smart'
    request.session['age'] = 18
    # request.session.set_expiry(5)
    return HttpResponse('設置session')

獲取 session 

age = request.session['age']

清除 session 信息

request.session.flush()

def clear_session(request):
    '''清除session信息'''
    # request.session.clear()
    request.session.flush()
    return HttpResponse('清除成功')

Django學習路36_函數參數 反向解析 修改404 頁面

 

 

 

 

 

在 templates 中建立對應文件名的 html 文件 (404.html)
注:
開發者服務器發生變動是由於 python 代碼發生變化
若是 html 文件發生變化,服務器不會進行重啓
須要本身手動修改
注意就近原則,若是有重複名字,先用最近的
Django學習路37_request屬性

 

 

打印元信息,基本上都會打印出來
類字典結構的 key 鍵 容許重複

 

get 請求能夠傳參,可是長度有限制 最大不能超過 2K post 文件上傳使用 get 參數 默認放在網址中 post 在請求體中 post 請求能夠獲取 get 請求參數
類字典結構: <QueryDict> 鍵能夠重複 字典結構: 鍵是 哈希表,保證不重複

 

 
  

 

 

 

打印 訪問網站的用戶的 IP 地址

老男孩Django筆記(非原創)
3、WEB框架

    MVC
        Model       View       Controller
        數據庫   模板文件    業務處理
    
    
    MTV

        Model    Template     View
        數據庫   模板文件    業務處理
    
    
    ############## WEB:MVC、MTV
    
4、Django
    
    pip3 install django
    
    
    C:\Python35\Scripts
    
    # 建立Django工程
    django-admin startproject 【工程名稱】
    
        mysite
            - mysite        # 對整個程序進行配置
                - init
                - settings  # 配置文件
                - url       # URL對應關係
                - wsgi      # 遵循WSIG規範,uwsgi + nginx
            - manage.py     # 管理Django程序:
                                - python manage.py 
                                - python manage.py startapp xx
                                - python manage.py makemigrations
                                - python manage.py migrate
        
        
        
    # 運行Django功能
    python manage.py runserver 127.0.0.1:8001
    
    
    chouti
        - chouti
            - 配置
        - 主站 app
        - 後臺管理 app
    
    
    
    # 建立app
    python manage.py startapp cmdb
    python manage.py startapp openstack
    python manage.py startapp xxoo....
    
    
    app:
        migrations     數據修改表結構
        admin          Django爲咱們提供的後臺管理
        apps           配置當前app
        models         ORM,寫指定的類  經過命令能夠建立數據庫結構
        tests          單元測試
        views          業務代碼
    
    
    
    1、配置模板的路徑
    
        TEMPLATES = [
                {
                    'BACKEND': 'django.template.backends.django.DjangoTemplates',
                    'DIRS': [os.path.join(BASE_DIR, 'templates')],
                    'APP_DIRS': True,
                    'OPTIONS': {
                        'context_processors': [
                            'django.template.context_processors.debug',
                            'django.template.context_processors.request',
                            'django.contrib.auth.context_processors.auth',
                            'django.contrib.messages.context_processors.messages',
                        ],
                    },
                },
            ]
    2、配置靜態目錄
        static
    
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, 'static'),
        )

        
        <link rel="stylesheet" href="/static/commons.css" />
    

內容整理
    1. 建立Django工程
            django-admin startproject 工程名

    2. 建立APP
        cd 工程名
        python manage.py startapp cmdb

    3、靜態文件
        project.settings.py
        
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )
    
    4、模板路徑
    
        DIRS ==>    [os.path.join(BASE_DIR,'templates'),]
        
    5、settings中
        
        middlerware
        
            # 註釋 csrf
            
            
    6、定義路由規則
        url.py
        
            "login" --> 函數名
            
    7、定義視圖函數
        app下views.py
            
            def func(request):
                # request.method   GET / POST
                
                # http://127.0.0.1:8009/home?nid=123&name=alex
                # request.GET.get('',None)   # 獲取請求發來的而數據
                
                # request.POST.get('',None)
                
                
                # return HttpResponse("字符串")
                # return render(request, "HTML模板的路徑")
                # return redirect('/只能填URL')
                
    8、模板渲染
        特殊的模板語言
        
            -- {{ 變量名 }}
        
                def func(request):
                    return render(request, "index.html", {'current_user': "alex"})
        
                    
                index.html
                
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                    </body>
                
                </html>
                
                ====> 最後生成的字符串
                
                <html>
                ..
                    <body>
                        <div>alex</div>
                    </body>
                
                </html>
            -- For循環
                def func(request):
                    return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})
        
                    
                index.html
                
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                        
                        <ul>
                            {% for row in user_list %}
                            
                                {% if row == "alex" %}
                                    <li>{{ row }}</li>
                                {% endif %}
                                
                            {% endfor %}
                        </ul>
                        
                    </body>
                
                </html>
                
            #####索引################# 
                def func(request):
                    return render(request, "index.html", {
                                'current_user': "alex", 
                                'user_list': ['alex','eric'], 
                                'user_dict': {'k1': 'v1', 'k2': 'v2'}})
        
                    
                index.html
                
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                        
                        <a> {{ user_list.1 }} </a>
                        <a> {{ user_dict.k1 }} </a>
                        <a> {{ user_dict.k2 }} </a>
                        
                    </body>
                
                </html>
            
            ###### 條件
            
                def func(request):
                    return render(request, "index.html", {
                                'current_user': "alex", 
                                "age": 18,
                                'user_list': ['alex','eric'], 
                                'user_dict': {'k1': 'v1', 'k2': 'v2'}})
        
                    
                index.html
                
                <html>
                ..
                    <body>
                        <div>{{current_user}}</div>
                        
                        <a> {{ user_list.1 }} </a>
                        <a> {{ user_dict.k1 }} </a>
                        <a> {{ user_dict.k2 }} </a>
                        
                        {% if age %}
                            <a>有年齡</a>
                            {% if age > 16 %}
                                <a>老男人</a>
                            {% else %}
                                <a>小鮮肉</a>
                            {% endif %}
                        {% else %}
                            <a>無年齡</a>
                        {% endif %}
                    </body>
                
                </html>
    
    
    
XXOO管理:
    MySQL
    SQLAlchemy
    主機管理(8列):
        IP
        端口
        業務線
        ...
        
    用戶表:
        用戶名
        密碼
    
    功能:
        1、 登陸
        2、主機管理頁面
            - 查看全部的主機信息(4列)
            - 增長主機信息(8列) ** 模態對話框
        3、查看詳細
            url:
                "detail" -> detail
        
            def detail(reqeust):
                nid = request.GET.get("nid")
                v = select * from tb where id = nid
                ...
        4、刪除
            del_host -> delete_host
            
            def delete_host(request):
                nid = request.POST.get('nid')
                delete from tb where id = nid
                return redirect('/home')
            
    

上節內容回顧:
    1、Django請求生命週期
        -> URL對應關係(匹配) -> 視圖函數 -> 返回用戶字符串
        -> URL對應關係(匹配) -> 視圖函數 -> 打開一個HTML文件,讀取內容
        
    2、建立django projcet

        django-admin startproject mysite
        

        ..
        
        mysite
            mysite
                - 配置文件
                - url.py
                - settings.py
            
        cd mysite
        python manage.py startapp cmdb
        
        mysite
            mysite
                - 配置文件
                - url.py
                - settings.py
            cmdb
                - views.py
                - admin.py
                - models.py # 建立數據庫表

    3、配置
        
        模板路徑
        靜態文件路徑
        # CSRF
        
    4、編寫程序

        a. url.py
            
            /index/    ->   func
            
        b. views.py
            
            def func(request):
                # 包含全部的請求數據
                ...
                return HttpResponse('字符串')
                return render(request, 'index.html', {''})
                retrun redirect('URL')
                
        c. 模板語言
            return render(request, 'index.html', {'li': [11,22,33]})
            
            {% for item in li %}
                <h1>{{item}}</h1>
            {% endfor %}
            
            
            ***********  索引用點 **********
            <h2> {{item.0 }} </h2>

1、路由系統,URL
    1、url(r'^index/', views.index),    
       url(r'^home/', views.Home.as_view()),
    2、url(r'^detail-(\d+).html', views.detail),  
    3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
       
       PS:
            def detail(request, *args,**kwargs):
                pass
    
       實戰:
            a. 
                url(r'^detail-(\d+)-(\d+).html', views.detail),
                
                def func(request, nid, uid):
                    
                    pass
            
                def func(request, *args):
                    args = (2,9)
                    
                    
                def func(request, *args, **kwargs):
                    args = (2,9)
       
            b. 
                url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)
                
                def func(request, nid, uid):
                    pass
                    
                def funct(request, **kwargs):
                    kwargs = {'nid': 1, 'uid': 3}
                    
                def func(request, *args, **kwargs):
                    args = (2,9)
    4、 name
        
        對URL路由關係進行命名, ***** 之後能夠根據此名稱生成本身想要的URL *****
        
        url(r'^asdfasdfasdf/', views.index, name='i1'),
        url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
        url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
        
        
        
        def func(request, *args, **kwargs):
            from django.urls import reverse
            
            url1 = reverse('i1')                              # asdfasdfasdf/
            url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
            url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
        
        
        xxx.html
            
            {% url "i1" %}               # asdfasdfasdf/
            {% url "i2" 1 2 %}           # yug/1/2/
            {% url "i3" pid=1 nid=9 %}   # buy/1/9/
        
        注:
            # 當前的URL
            request.path_info 
    5、多級路由
        
        project/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin

            urlpatterns = [
                url(r'^cmdb/', include("app01.urls")),
                url(r'^monitor/', include("app02.urls")),
            ]
            
        app01/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
            from app01 import views

            urlpatterns = [
                url(r'^login/', views.login),
            ]
            
        app02/urls.py
            from django.conf.urls import url,include
            from django.contrib import admin
            from app02 import views

            urlpatterns = [
                url(r'^login/', views.login),
            ]
    
2、視圖
    1、獲取用戶請求數據
        request.GET
        request.POST
        request.FILES
        PS:
            GET:獲取數據                
            POST:提交數據
            
    2、checkbox等多選的內容
        request.POST.getlist()
    3、上傳文件
        # 上傳文件,form標籤作特殊設置
        obj = request.FILES.get('fafafa')
        obj.name
        f = open(obj.name, mode='wb')
        for item in obj.chunks():
            f.write(item)
        f.close()
    
    4、FBV & CBV
       function base view
       
        url.py
            index -> 函數名
            
        view.py
            def 函數(request):
                ...
        ====/index/ -> 函數名
            
        /index/ ->====》
        
        建議:二者都用
        
    5、裝飾器


4、ORM操做
    select * from tb where id > 1
    # 對應關係
    models.tb.objects.filter(id__gt=1)
    models.tb.objects.filter(id=1)
    models.tb.objects.filter(id__lt=1)
    
    建立類
    
    a. 先寫類
        from django.db import models

        # app01_userinfo
        class UserInfo(models.Model):
            # id列,自增,主鍵
            # 用戶名列,字符串類型,指定長度
            username = models.CharField(max_length=32)
            password = models.CharField(max_length=64)
        
    b. 註冊APP

        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'app01',
        ]
    c. 執行命令
        python manage.py  makemigrations
        python manage.py  migrate
        
    d. ********** 注意 ***********
        Django默認使用MySQLdb模塊連接MySQL
        主動修改成pymysql,在project同名文件夾下的__init__文件中添加以下代碼便可:
            import pymysql
            pymysql.install_as_MySQLdb()
    
    1. 根據類自動建立數據庫表
        # app下的models.py
    
        python manage.py  makemigrations
        python manage.py  migrate
        
        
        字段:
            字符串類型
            
            
            數字
            
            
            時間
            
            
            二進制
            
            自增(primary_key=True)
            
        字段的參數:
            null               -> db是否能夠爲空
            default            -> 默認值
            primary_key        -> 主鍵
            db_column          -> 列名
            db_index           -> 索引
            unique               -> 惟一索引
            unique_for_date    -> 
            unique_for_month
            unique_for_year
            auto_now           -> 建立時,自動生成時間
            auto_now_add       -> 更新時,自動更新爲當前時間
            
                # obj = UserGroup.objects.filter(id=1).update(caption='CEO')
                # obj = UserGroup.objects.filter(id=1).first()
                # obj.caption = "CEO"
                # obj.save()
                
            choices              -> django admin中顯示下拉框,避免連表查詢
            blank             -> django admin是否能夠爲空
            verbose_name      -> django admin顯示字段中文
            editable          -> django admin是否能夠被編輯
            error_messages    -> 錯誤信息欠
            help_text         -> django admin提示
            validators          -> django form ,自定義錯誤信息(欠)
            
            
            建立 Django 用戶:python manage.py createsuperuser
            
            
            
            
    2. 根據類對數據庫表中的數據進行各類操做
    
        一對多:
        
            a. 外檢
            b. 
                外鍵字段_id
            c.
                models.tb.object.create(name='root', user_group_id=1)
                
            d. 
                
                userlist = models.tb.object.all()
                for row in userlist:
                    row.id
                    row.user_group_id
                    row.user_group.caption
                    
                    
    =================== 做業:用戶管理 ====================
    1、用戶組的增刪改查
    2、用戶增刪該查
        - 添加必須是對話框
        - 刪除必須是對話框
        - 修改,必須顯示默認值
        
    3、比較好看的頁面
    
    4、預習:
        http://www.cnblogs.com/wupeiqi/articles/5246483.html

1、Django請求的生命週期
        路由系統 -> 試圖函數(獲取模板+數據=》渲染) -> 字符串返回給用戶
        
2、路由系統
        /index/                ->  函數或類.as_view()
        /detail/(\d+)          ->  函數(參數) 或 類.as_view()(參數)
        /detail/(?P<nid>\d+)   ->  函數(參數) 或 類.as_view()(參數)
        /detail/               ->  include("app01.urls")
        /detail/    name='a1'  ->  include("app01.urls")
                               - 視圖中:reverse
                               - 模板中:{% url "a1" %}
                               
3、視圖
    FBV:函數
        def index(request,*args,**kwargs):
            ..
    
    CBV:類
        class Home(views.View):
            
            def get(self,reqeust,*args,**kwargs):
                ..
                
    獲取用戶請求中的數據:
        request.POST.get
        request.GET.get
        reqeust.FILES.get()
        
        # checkbox,
        ........getlist()
        
        request.path_info
        
        
        文件對象 = reqeust.FILES.get()
        文件對象.name
        文件對象.size
        文件對象.chunks()
        
        # <form 特殊的設置></form>
        
    給用戶返回數據:
        render(request, "模板的文件的路徑", {'k1': [1,2,3,4],"k2": {'name': '張揚','age': 73}})
        redirect("URL")
        HttpResponse(字符串)
        
    
4、模板語言
        render(request, "模板的文件的路徑", {'obj': 1234, 'k1': [1,2,3,4],"k2": {'name': '張揚','age': 73}})
    
    <html>
    
    <body>
        <h1> {{ obj }} </h1>
        <h1> {{ k1.3 }} </h1>
        <h1> {{ k2.name }} </h1>
        {% for i in k1 %}
            <p> {{ i }} </p>
        {% endfor %}
        
        {% for row in k2.keys %}
            {{ row }}
        {% endfor %}
        
        {% for row in k2.values %}
            {{ row }}
        {% endfor %}
        
        {% for k,v in k2.items %}
            {{ k }} - {{v}}
        {% endfor %}
        
    </body>
    </html>
    
5、ORM
    a. 建立類和字段
        class User(models.Model):
            age = models.IntergerFiled()
            name = models.CharField(max_length=10)#字符長度
            
        Python manage.py makemigrations
        python manage.py migrate
        
        # settings.py 註冊APP
        
    b. 操做
        增
            models.User.objects.create(name='qianxiaohu',age=18)
            dic = {'name': 'xx', 'age': 19}
            models.User.objects.create(**dic)

            obj = models.User(name='qianxiaohu',age=18)
            obj.save()
        刪
            models.User.objects.filter(id=1).delete()
        改
            models.User.objects.filter(id__gt=1).update(name='alex',age=84)
            dic = {'name': 'xx', 'age': 19}
            models.User.objects.filter(id__gt=1).update(**dic)
        查
            models.User.objects.filter(id=1,name='root')
            models.User.objects.filter(id__gt=1,name='root')
            models.User.objects.filter(id__lt=1)
            models.User.objects.filter(id__gte=1)
            models.User.objects.filter(id__lte=1)
            
            models.User.objects.filter(id=1,name='root')
            dic = {'name': 'xx', 'age__gt': 19}
            models.User.objects.filter(**dic)
            
            v1 = models.Business.objects.all()
            # QuerySet ,內部元素都是對象
            
            # QuerySet ,內部元素都是字典
            v2 = models.Business.objects.all().values('id','caption')
            # QuerySet ,內部元素都是元組
            v3 = models.Business.objects.all().values_list('id','caption')
        
            # 獲取到的一個對象,若是不存在就報錯
            models.Business.objects.get(id=1)
            對象或者None = models.Business.objects.filter(id=1).first()

            外鍵:
                v = models.Host.objects.filter(nid__gt=0)
                v[0].b.caption  ---->  經過.進行跨表

        
        外鍵:
            class UserType(models.Model):
                caption = models.CharField(max_length=32)
              id  caption
            # 1,普通用戶
            # 2,VIP用戶
            # 3, 遊客
                
            class User(models.Model):
                age = models.IntergerFiled()
                name = models.CharField(max_length=10)#字符長度
                # user_type_id = models.IntergerFiled() # 約束,
                user_type = models.ForeignKey("UserType",to_field='id') # 約束,
        
              name age  user_type_id     

    position:fixed absolute relative

    Ajax
    
        $.ajax({
            url: '/host',
            type: "POST",
            data: {'k1': 123,'k2': "root"},
            success: function(data){
                // data是服務器端返回的字符串
                var obj = JSON.parse(data);
            }
        })
        
    
        建議:永遠讓服務器端返回一個字典
        
        return HttpResponse(json.dumps(字典))
        
            
多對多:
    建立多對多:
        方式一:自定義關係表
            class Host(models.Model):
                nid = models.AutoField(primary_key=True)
                hostname = models.CharField(max_length=32,db_index=True)
                ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
                port = models.IntegerField()
                b = models.ForeignKey(to="Business", to_field='id')
            # 10
            class Application(models.Model):
                name = models.CharField(max_length=32)
            # 2
            
            class HostToApp(models.Model):
                hobj = models.ForeignKey(to='Host',to_field='nid')
                aobj = models.ForeignKey(to='Application',to_field='id')
                
            # HostToApp.objects.create(hobj_id=1,aobj_id=2)
                
                
                
        方式二:自動建立關係表
            class Host(models.Model):
                nid = models.AutoField(primary_key=True)
                hostname = models.CharField(max_length=32,db_index=True)
                ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
                port = models.IntegerField()
                b = models.ForeignKey(to="Business", to_field='id')
            # 10
            class Application(models.Model):
                name = models.CharField(max_length=32)
                r = models.ManyToManyField("Host")
                
            沒法直接對第三張表進行操做
            
            obj = Application.objects.get(id=1)
            obj.name
            
            # 第三張表操做
            obj.r.add(1)
            obj.r.add(2)
            obj.r.add(2,3,4)
            obj.r.add(*[1,2,3,4])
            
            obj.r.remove(1)
            obj.r.remove(2,4)
            obj.r.remove(*[1,2,3])
            
            obj.r.clear()
            
            obj.r.set([3,5,7])
            
            # 全部相關的主機對象「列表」 QuerySet
            obj.r.all()

s14day21

上節內容回顧:
    1、請求週期
        url> 路由 > 函數或類 > 返回字符串或者模板語言?
        
        Form表單提交:
            提交 -> url > 函數或類中的方法 
                                - ....
                                HttpResponse('....')
                                render(request,'index.html')
                                redirect('/index/')
             用戶  <    <  返回字符串
             (當接受到redirect時)自動發起另一個請求
             --> url   .....
             
        Ajax:
            $.ajax({
                url: '/index/',
                data: {'k': 'v', 'list': [1,2,3,4], 'k3': JSON.stringfy({'k1': 'v'}))}, $(form對象).serilize() 
                type: 'POST',
                dataType: 'JSON':
                traditional: true,
                success:function(d){
                    location.reload()              # 刷新
                    location.href = "某個地址"     # 跳轉
                }
            })
            提交 -> url -> 函數或類中的方法 
                            HttpResponse('{}')
                            render(request, 'index.html', {'name': 'v1'})
                            <h1>{{ name }}</h1> --> 
                            <h1>v1</h1>
                            
                            XXXXXXX redirect...
            用戶    <<<<<  字符串
        
    
    2、路由系統URL
        a. /index/                               ->  函數或類
        b. /index/(\d+)                            ->  函數或類
        c. /index/(?P<nid>\d+)                   ->  函數或類
        d. /index/(?P<nid>\d+) name='root'          ->  函數或類
            reverse()
            {% url 'root' 1%}
        e. /crm/    include('app01.urls')        -> 路由分發
        
        f. 默認值
            url(r'^index/', views.index, {'name': 'root'}),
        
            def index(request,name):
                print(name)
                return HttpResponse('OK')
    
        g. 命名空間
            
            /admin/    include('app01.urls',namespace='m1')
            /crm/      include('app01.urls',namespace='m1')
            
            app01.urls
            /index/    name = 'n1'
            
            
            reverser('m1:n1')
    
    3、
        def func(request):
            request.POST
            request.GET
            request.FILES
            request.getlist
            request.method
            request.path_info
            
            return render,HttpResponse,redirect
            
    4、
        render(request, 'index.html')
        # for
        # if
        # 索引.   keys  values items    all
        
    5class User(models.Model):
            username = models.CharField(max_length=32)
            email = models.EmailField()
            
        有驗證功能
            Django Admin
        無驗證功能:
            User.objects.create(username='root',email='asdfasdfasdfasdf')
            User.objects.filter(id=1).update(email='666')
        
        
        
        class UserType(models.Model):
            name = models.CharField(max_length=32)
        
        
        class User(models.Model):
            username = models.CharField(max_length=32)
            email = models.EmailField()
            user_type = models.ForeignKey("UserType")
        
        user_list = User.objects.all()
        for obj user_list:
            obj.username,obj.email,obj.user_type_id,obj.user_type.name,obj.user_type.id
        
        user = User.objects.get(id=1)
        user.
        
        User.objects.all().values("username","user_type__name",)
        
        
        
        class UserType(models.Model):
            name = models.CharField(max_length=32)
        
        
        class User(models.Model):
            username = models.CharField(max_length=32)
            email = models.EmailField()
            user_type = models.ForeignKey("UserType")
            m = models.ManyToMany('UserGroup')
            
            
        class UserGroup(models.Model):
            name = ....
            
            
        obj = User.objects.get(id=1)
        obj.m.add(2)
        obj.m.add(2,3)
        obj.m.add(*[1,2,3])
        
        obj.m.remove(...)
        
        obj.m.clear()
        
        
        obj.m.set([1,2,3,4,5])
        
        # 多個組,UserGroup對象
        obj.m.all()
        obj.m.filter(name='CTO')
        
        
知識點:
    URL
        - 兩個
    Views
        - 請求的其餘信息
        from django.core.handlers.wsgi import WSGIRequest
        request.environ
        request.environ['HTTP_USER_AGENT']
        - 裝飾器
            FBV:
                def auth(func):
                    def inner(reqeust,*args,**kwargs):
                        v = reqeust.COOKIES.get('username111')
                        if not v:
                            return redirect('/login/')
                        return func(reqeust, *args,**kwargs)
                    return inner
        
            CBV:
                from django import views
                from django.utils.decorators import method_decorator

                @method_decorator(auth,name='dispatch')
                class Order(views.View):

                    # @method_decorator(auth)
                    # def dispatch(self, request, *args, **kwargs):
                    #     return super(Order,self).dispatch(request, *args, **kwargs)

                    # @method_decorator(auth)
                    def get(self,reqeust):
                        v = reqeust.COOKIES.get('username111')
                        return render(reqeust,'index.html',{'current_user': v})

                    def post(self,reqeust):
                        v = reqeust.COOKIES.get('username111')
                        return render(reqeust,'index.html',{'current_user': v})
    Templates
        - 母版...html
            extends
            include
        - 自定義函數
            simple_tag
                a. app下建立templatetags目錄
                b. 任意xxoo.py文件
                c. 建立template對象 register
                d. 
                    @register.simple_tag
                    def func(a1,a2,a3....)
                        return "asdfasd"
                e. settings中註冊APP
                f. 頂部 {% load xxoo %}
                g. {% 函數名 arg1 arg2 %}
                缺點:
                    不能做爲if條件
                優勢:
                    參數任意
            filter
                a. app下建立templatetags目錄
                b. 任意xxoo.py文件
                c. 建立template對象 register
                d. 
                    @register.filter
                    def func(a1,a2)
                        return "asdfasd"
                e. settings中註冊APP
                f. 頂部 {% load xxoo %}
                g. {{ 參數1|函數名:"參數二,參數三" }} {{ 參數1|函數名:數字 }}
                缺點:
                    最多兩個參數,不能加空格
                優勢:
                    能做爲if條件
            
    分頁(自定義的分頁)
        
        XSS:
            {{ page_str|safe }}
            
            mark_safe(page_str)
    
    cookie
        客戶端瀏覽器上的一個文件
            {"user": 'dachengzi'}
    
    session :裝飾器
        
    
    Models
        - 一大波操做
        
    Form驗證
        -
    緩存
    中間件
    信號
    CSRF
    Admin/ModelForm
        
做業:
    主機管理:
        1、單表操做
        2、一對多
        3、多對多
        要求:
            a. 刪除對話框
            b. 修改,添加新URL
            c. 基於cookie進行用戶認證
            d. 定製顯示個數
            e. 分頁
    預習:
        Form: http://www.cnblogs.com/wupeiqi/articles/6144178.html
        Model:http://www.cnblogs.com/wupeiqi/articles/6216618.html

day22

知識點概要
    - Session
    - CSRF
    - Model操做
    - Form驗證(ModelForm)
    - 中間件
    - 緩存
    - 信號


內容詳細:

1. Session
    基於Cookie作用戶驗證時:敏感信息不適合放在cookie中
    

    a. Session原理
        Cookie是保存在用戶瀏覽器端的鍵值對
        Session是保存在服務器端的鍵值對
    
    b. Cookie和Session對比
    
    c. Session配置(缺乏cache)
    
    d. 示例:實現兩週自動登錄
            - request.session.set_expiry(60*10)
            - SESSION_SAVE_EVERY_REQUEST = True

    PS: cookie中不設置超時時間,則表示關閉瀏覽器自動清除
    
    
    - session依賴於cookie
    - 服務器session
        request.session.get()
        request.session[x] = x
        
        request.session.clear()
        
    - 配置文件中設置默認操做(通用配置):
        SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
        SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路徑(默認)
        SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默認)
        SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(默認)
        SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http傳輸(默認)
        SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默認)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過時(默認)
        # set_cookie('k',123)
        SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都保存Session,默認修改以後才保存(默認)

    - 引擎的配置
    
2. CSRF
    a. CSRF原理

    b. 無CSRF時存在隱患

    c. Form提交(CSRF)

    d. Ajax提交(CSRF)
       CSRF請求頭 X-CSRFToken
       
6. 中間件

7. 緩存
    5種配置
    3種應用:
        全局
        視圖函數
        模板

8. 信號
    - 內置信號
    - 自定義
         - 定義信號
         - 出發信號
         - 信號中註冊函數
    
3. Model操做
    
    a. 字段類型 + 參數

    b. 連表字段 + 參數

    c. Meta

    d. SQL操做:
        - 基本增刪改查
        - 進階操做
        - 正反查詢
        - 其餘操做

    e. 驗證(弱)

4. Form操做
    完成:
        - 驗證用戶請求
        - 生成HTML
          (保留上一次提交的數據)
        
    自定義:
        -- 字段(校驗)
        - 插件(生成HTML)
        
    初始化操做:
        

============= 做業:xxxoo管理 =============
用戶驗證:session
新URL:Form驗證
中間件:IP過濾
信號:記錄操做
CSRF:
    
    
    a. Form驗證用戶請求

    b. Form生成HTML

    c. Form字段詳細(自定義字段,Model...) + 插件

    d. 自定義驗證(鉤子以及__all__)

    e. 註冊示例:
         用戶名、密碼、郵箱、手機號(RegexValidator或RegexField)、性別、愛好、城市
    
    f. 初始化值

5. ModelForm

    a. Model+Form功能集合

    b. save

    c. save + save_m2m

    Model
        - 數據庫操做
        - 驗證
        class A(MOdel):
            user = 
            email = 
            pwd = 
        
    Form
        - class LoginForm(Form): 
            email = fields.EmailField()
            user = 
            pwd = 
            
        - is_valid -> 每個字段進行正則(字段內置正則)+clean_字段 -> clean(__all__)  -> _post_clean
        - cleand_data
        - error
    --------> 推薦 <---------
        
1、ModelForm
    參考博客:
        http://www.cnblogs.com/wupeiqi/articles/6229414.html
    
    Model + Form => 驗證 + 數據庫操做
    - class LoginModelForm(xxxxx): 
         利用model.A中的字段
         
         
    1. 生成HTML標籤:class Meta: ...
    2. mf = xxxModelForm(instance=ModelObj)
    3. 額外的標籤, is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())
    4. 各類驗證 is_valid() -> 各類鉤子...
    5.     mf.save()
        # 或
        instance = mf.save(False)
        instance.save()
        mf.save_m2m()
    

2、Ajax
    參考博客:
        http://www.cnblogs.com/wupeiqi/articles/5703697.html
    
    原生
        
    jQuery
    
    僞Ajax操做
    
    時機:
        若是發送的是【普通數據】 -> jQuery,XMLHttpRequest,iframe
    
3、文件上傳(預覽)
    
    - Form提交
    - Ajax上傳文件
    
    時機:
        若是發送的是【文件】 -> iframe,jQuery(FormData),XMLHttpRequest(FormData),
    

4、圖片驗證碼 + Session
    
    - session
    - check_code.py(依賴:Pillow,字體文件)
    - src屬性後面加?

5、CKEditor,UEEditor,TinyEditor,KindEditor(***)
    參考博客:
        http://www.cnblogs.com/wupeiqi/articles/6307554.html
        
    - 基本使用
    - 文件上傳,多文件上傳,文件空間管理
    - XSS攻擊(過濾的函數或類) 下節課說...

僅供學習使用

Django建立項目時應該要作的幾件事
安裝 django 1.11.14
pip install django==1.11.14 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

卸載 django 1.11.14
pip uninstall django==1.11.14
建立 django 項目
django-admin startproject 項目名

django-admin startproject study
建立 app,到 study 項目名稱目錄下輸入
python manage.py startapp app名稱

python manage.py startapp app01
在 C:\Users\47311\AppData\Local\Programs\Python\Python38\Lib\site-packages\django\contrib\admin 目錄下的

widgets.py 中的152行刪除 , 逗號

在 pycharm 中打開 django 項目工程

 

 

 

建立好的項目工程


配置建立好的 app 應用(根據建立app時的名稱進行添加到 INSTALLED_APPS 中)


新建文件夾命名爲 templates -> 建立模板

 

 

在 項目的 settings 中進行註冊 templats ,本文中的 settings 均是指 項目下的 settings 

 

 

在 TEMPLATES 下的 DIRS 中 添加 

os.path.join(BASE_DIR,'templates')

建立靜態文件夾 static ,步驟如上所示

 

 

在 settings 中進行註冊 ,在最後一行位置添加 

STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
)

修改頁面顯示的語言爲漢語

LANGUAGE_CODE 修改成 
LANGUAGE_CODE = 'zh-hans'

修改時間 TIME_ZONE 爲北京時間

TIME_ZONE = 'Asia/Shanghai'

 


運行 django 項目命令 ,啓動也能夠選擇右上角的三角符號

python manage.py runserver

運行成功界面,django的版本不少,若是您成功了,請繼續努力.

 django 命令行命令

django-admin startproject 項目名 django-admin startproject python manage.py makemigrations python manage.py migrate python manage.py startapp app名稱 python manage.py startapp 啓動運行 django python manage.py runserver

 

項目下的 urls 篇 urlpatterns = [ ] 其中主要是包含有各個 app 的路由 示例: url(r'^users/', include('users.urls', namespace='users')), url(r'^admin/', admin.site.urls),
settings 中的基礎知識 INSTALLED_APPS = [ ] 存放建立好的app名稱(app註冊) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'users', '建立好的app名稱', ]
MIDDLEWARE = [] 中間件
TEMPLATES = [ ] 模板文件 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] 'DIRS'能夠修改成 'DIRS': [os.path.join(BASE_DIR, 'templates')],
DATABASES  = { } 數據庫 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '數據庫', 'USER': '用戶名', 'PASSWORD': '密碼', 'CHARSET': '字符集', 'HOST': 'IP地址', 'PORT': '端口', } } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'webshop', 'USER': 'root', 'PASSWORD': 'root', 'CHARSET': 'UTF-8', 'HOST': '127.0.0.1', 'PORT': '3306', } }
設置中文 LANGUAGE_CODE = 'zh-hans'
時間顯示爲北京時間 TIME_ZONE = 'Asia/Shanghai'
配置 static 靜態目錄 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )

暫時尚未接觸到的點(慎用) SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' # hash加密使用的鹽值 SALT_KEY = "Hello" LOGIN_URL = '/users/login'

項目的 __init__ 文件中添加的內容

import pymysql

pymysql.install_as_MySQLdb()

app 的urls(建立的.py文件) 導入 views from . import views urlpatterns = [ url(r'^login/$', views.user_login, name='user_login'), url(r'^register/$', views.register, name='register'), ]
使用 (?P<views 中的函數參數名稱>\d+) 獲取傳遞進來的參數給 views 中函數的參數 urlpatterns = [ url(r'^(?P<s_id>\d+)/detail_store', views.detail_store, name='detail_store'), url(r'^(?P<s_id>\d+)/(?P<status>\d+)/status_store', views.status_store, name='status_store'), ]
urlpatterns = [ url(r'^(?P<number>\d+)/(?P<goods_id>\d+)/shop_into/$', views.shop_into, name='shop_into'), url(r'^list_car/$', views.list_car, name='list_car'), url(r'^(?P<shopcar_id>\d+)/del_car/$', views.del_car, name='del_car'), ]
urlpatterns = [ url(r'^order_confirm/$', views.order_confirm, name='order_confirm'), url(r'^order_pay/$', views.order_pay, name='order_pay'), url(r'^order_done/$', views.order_done, name='order_done'), url(r'^order_list/$', views.order_list, name='order_list'), url(r'^(?P<order_id>\d+)/order_desc/$', views.order_desc, name='order_desc'), ]
url(r'^路由地址/$', views.函數名, name='名稱'), url(r'^(?P<函數參數名稱>\d+)/路徑名/$', views.函數名, name='名稱'),
關於路由系統,這裏只是寫出了最簡單的寫法,此處只是根據讀程序獲取到的部分知識

app 的 models,爲 views 做基礎,views在獲取到urls中的請求後,會調用一些方法
建立主鍵 -> 1.11.14 自動建立 id 列 在外鍵關聯時,自動加上 _id 名稱 id = models.AutoField(primary_key=True)
建立字符串 name 列 ,使用 models.CharField country = models.CharField(max_length=255, default='中國',verbose_name='城市') area = models.CharField(max_length=50, verbose_name='收貨人縣/區/')
使用 bool 類型 數據字段名稱 = models.BooleanField(default=False, verbose_name='xxx') is_default = models.BooleanField(default=False, verbose_name='是不是默認地址')
int 類型 , 使用 models.IntegerField age = models.IntegerField(default='20', verbose_name='用戶年齡') status = models.IntegerField(default=0, verbose_name='店鋪狀態') goods_count = models.IntegerField(verbose_name='購買數量')
image 圖片類型 使用 models.ImageField 變量名 = models.ImageField(upload_to='圖片路徑', default='圖片名', verbose_name='名稱') 變量名 = models.ImageField(upload_to='圖片路徑') logo = models.ImageField(upload_to='static/images/logo', default='static/images/logo/goods-style1.png', verbose_name='商品類型圖標') path = models.ImageField(upload_to='static/images/goods', default='static/images/goods/default.jpg', verbose_name='商品圖片') goods_image = models.ImageField(upload_to='static/images/goods') cover = models.ImageField(upload_to='static/images/store/', default='static/images/store/default.jpg', verbose_name='店鋪封面') header = models.ImageField(upload_to='static/images/headers', default='static/images/headers/default.jpg', verbose_name='用戶頭像')
text 描述 使用 models.TextField 變量名 = models.TextField(verbose_name= '名稱') 變量名 = models.TextField(null=True, blank=True,verbose_name= '名稱') intro = models.TextField(verbose_name='商品類別描述') intro = models.TextField(null=True, blank=True, verbose_name='商品圖片描述')
float 浮點數類型,使用 models.FloatField 變量名 = models.FloatField(verbose_name='名稱') 變量名 = models.FloatField(default=0.00, verbose_name='名稱') price = models.FloatField(verbose_name='商品價格') allMoney = models.FloatField(default=0.00, verbose_name='總計')
datetime 使用 models.DateTimeField 變量名 = models.DateTimeField(auto_now_add=True, verbose_name='名稱') openTime = models.DateTimeField(auto_now_add=True, verbose_name='開店時間') 注:能夠添加 datetime.now 用來在建立時,指定當前時間
foreignkey 外鍵 , 使用 models.ForeignKey 變量名 = models.ForeignKey(類名, null=True, blank=True, on_delete=models.CASCADE, verbose_name='名稱') parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父級地址')
from app名稱.models import 類名 變量名 = models.ForeignKey(類名, on_delete=models.CASCADE, verbose_name='名稱') 注:類名能夠是外部導入或本models.py中建立的類名 from users.models import User user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='地址所屬')
一個models 類能夠存在兩個外鍵 goodsStore = models.ForeignKey(類名, on_delete=models.CASCADE, verbose_name='名稱') goodsType = models.ForeignKey(類名, on_delete=models.CASCADE, verbose_name='名稱') from store.models import Store goodsStore = models.ForeignKey(Store, on_delete=models.CASCADE, verbose_name='商品所屬店鋪') goodsType = models.ForeignKey(GoodsType, on_delete=models.CASCADE, verbose_name='商品類型')
從 django.contrib.auth.models 導入 User from django.contrib.auth.models import User user = models.ForeignKey(User, on_delete=models.CASCADE)
一對一 使用 models.OneToOneField 變量名 = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
在這裏補充一點,字段還存在一對多和多對多

app 中的 views 
def 函數名(request): 代碼塊 return 語句(是否存在參數) def 函數名(request,參數(一個或多個)): 代碼塊 return 語句(是否存在參數) @裝飾器(一個或多個) def 函數名(request): 代碼塊 return 語句(是否存在參數) @裝飾器(一個或多個) def 函數名(request,參數(一個或多個)): 代碼塊 return 語句(是否存在參數)
關於def 函數定義時,request 後面的參數 在進行路由分發時,使用 url(r'^(?P<g_id>\d+)/goods_detail/$', views.goods_detail, name='goods_detail'), 進行 get 請求傳遞進來的參數會給 g_id ,所以在 goods_detail 函數中要設置一個參數名爲 g_id def goods_detail(request, g_id): 代碼
注:有多少個?P<參數名> 就設置多少個參數,用來接收
代碼塊中可使用到不少知識,此處只是該項目使用到的基礎 request.method 判斷進行的哪種請求方式,GET仍是POST if request.method == 'GET': pass elif request.method == 'POST': pass else: pass
models.類名.objects.filter(表中字段(user)=request.user) filter 主要是用來過濾,使用了filter 以後還能夠繼續使用 filter進行過濾 address_list = models.Address.objects.filter(user=request.user)

對於使用了 filter 方法 的對象,可使用 len 進行判斷,是否已經存在javascript

sto = models.Store.objects.filter(name=name)
if len(sto) == 1:
return render(request, 'store/store_add.html', {"msg": "商鋪名稱已存在,請從新輸入"})
獲取 post 方式提交的數據 request.POST['名稱'] recv_name = request.POST['recv_name'] html 中數據以下,讓name的值於名稱相對應便可 <input type="text" name="recv_name" id="recv_name" autocomplete="off">

name = request.POST['name'].strip()
在進行獲取數據時,能夠添加 strip 進行字符串操做
對於 filter 獲取到的數據能夠進行遍歷 address_list = models.Address.objects.filter(user=request.user) 而且遍歷的元素對象具備 save 方法 能夠修改字段 Address 是類名,user , is_default 是 Address 表中的字段 from . import models address_list = models.Address.objects.filter(user=request.user) for addr in address_list: addr.is_default = False addr.save()

使用 __in 時,能夠直接寫明在某一個變量中 [0,1]
stores = models.Store.objects.filter(user=request.user, status__in=[0, 1])
添加表的一行數據 括號中 = 前面的都是表中的字段,後面是對應的值 使用 save 進行保存 變量 = models.類名(字段1 = 值1, 字段2 = 值2, user=request.user) 變量 .save() address = models.Address(recv_name=recv_name, recv_tel=recv_tel, province=province, city=city, area=area, street=street, desc=desc, is_default=True, user=request.user) address.save()

goods = models.Goods(name=name, price=price, stock=stock, desc=desc, goodSize=goodSize, goodsType=goodsType,goodsStore=store ) goods.save()
 
  
 
  
id 自增列不用添加
在使用 filter 獲取數據後,使用 order_by 進行排序 from app名稱.models import 類名 變量名 = 類名.objects.filter(user=request.user).order_by('名稱') shop_cars = ShopCar.objects.filter(user=request.user).order_by('-createTime')
在 filter 中使用 = 變量名 = 類名.objects.filter(字段名=值) goods_type1 = GoodsType.objects.filter(pk=1001)
在 filter 中使用 __in 變量名 = 類名.objects.filter(字段名__in=值) 變量名 = 類名.objects.filter(字段名__in=值)[:2] goods1_list = Goods.objects.filter(goodsType__in=goods_type1_2)[:4]
在 filter 中使用 __isnull 變量名 = 類名.objects.filter(字段名__isnull=True) allGoodsType = GoodsType.objects.filter(parent__isnull=True)
文件 files , 具體請查閱更多資料 變量名 = request.FILES['名稱'] path = request.FILES['path']

cover = request.FILES['cover']
cover 爲 html 中的 name 值 <input name="cover" type="file" ... >
使用 .get 獲取數據 變量 = 類名.objects.get(字段=變量或值) store_id = request.POST['goodsStore'] store = Store.objects.get(pk=store_id)
是否帶有 models 主要看導入包的方式 from . import models type2 = request.POST['type2'] goodsType = models.GoodsType.objects.get(pk=type2)
利用獲取到的對象的字段屬性進行賦值 變量 = models.Goods.objects.get(字段名1=參數) 變量= goods.字段名2 store = models.類名.objects.get(字段名1=字段名2) goods = models.Goods.objects.get(pk=g_id) goodsStore_id = goods.goodsStore_id store = models.Store.objects.get(pk=goodsStore_id) 注: 字段名根據實際須要進行修改
獲取全部數據 使用 all 變量名 = models.類名.objects.all() all_goods = models.Goods.objects.all()
獲取 GET 參數 變量名1 = request.GET['名稱'] parent_id = request.GET['parent_id'] 進行查找數據 變量名2 = models.類名.objects.filter(字段=變量名1) type2 = models.GoodsType.objects.filter(parent=parent_id)
使用 getlist 獲取多個數據 變量 = request.POST.getlist('名稱') shopcar_id_list = request.POST.getlist('buy_goods_id') 進行查找數據 變量2 = app名.models.類名.objects.filter(字段名__in=變量)
shopcar_list = shopcar.models.ShopCar.objects.filter(pk__in=shopcar_id_list)
關於字段中 user=request.user 的理解 MyOrder 中的 user 是 User 的外鍵,因此在使用時,要注意傳遞的屬性仍是一整個對象 my_order = models.MyOrder(user=request.user, address=addr, total=total) user = models.ForeignKey(User, on_delete=models.CASCADE)
使用 字段_set 能夠獲取到外鍵的表的字段,具體詳情請查閱更多資料 此處僅給出部分示例 for sc_id in shopcar_list: shopcart = shopcar.models.ShopCar.objects.get(pk=sc_id) order_item = models.MyOrderItem(goods_image=shopcart.goods.goodsimage_set.first().path, goods_name=shopcart.goods.name, goods_price=shopcart.goods.price, goods_count=shopcart.number, goods_money=shopcart.allMoney, my_order=my_order) order_item.save() total += shopcart.allMoney my_order.total = total my_order.save()
get 獲取寫法,比以前的更深刻一些 @login_required @require_GET def shop_into(request, number, goods_id): goods = Goods.objects.get(pk=goods_id) user = request.user try: shop_car = models.ShopCar.objects.get(user=user, goods=goods) shop_car.number += int(number) shop_car.allMoney = shop_car.number*goods.price shop_car.save() except: shop_car = models.ShopCar(goods=goods, number=number, user=user) shop_car.allMoney = int(shop_car.number)*goods.price shop_car.save() return redirect(reverse('shopcar:list_car'))

在使用 get 方法時,其中的 = 左側依舊爲字段名,=右側的爲get 獲取到的對象,user 爲 request.user

goods = Goods.objects.get(pk=goods_id)
user = request.user
shop_car = models.ShopCar.objects.get(user=user, goods=goods)

request.user 擁有 id 屬性

使用 get 能夠獲取到字段進行參與表達式運算

shop_car.allMoney = shop_car.number*goods.price
刪除數據 使用 delete()
shopcar = models.ShopCar(pk=shopcar_id, user=user)
shopcar.delete()
使用 int 進行轉換 status = models.IntegerField(default=0, verbose_name='店鋪狀態') store = models.Store.objects.get(id=s_id) store.status = int(status)
獲取 session 使用 request.session 變量名 = request.session["名稱"] 示例: if code.lower() != request.session["code"].lower(): return render(request, "users/user_login.html", {"msg": "驗證碼錯誤!!"})
使用 authenticate from django.contrib.auth import authenticate user = authenticate(username=username, password=password1) password1 = utils.encryption(password) # 密碼加密 def encryption(key): pwd = hmac.new(key.encode('utf-8'), settings.SALT_KEY.encode('utf-8'), 'MD5') return pwd.hexdigest()

此時的 user 擁有 is_active 屬性,判斷是否登陸狀態
if user is not None: if user.is_active: login(request, user) try: return redirect(next_url) except: return redirect("/") else: return render(request, "users/user_login.html", {"msg": "您的帳號已被鎖定,請聯繫管理員"}) else: return render(request, "users/user_login.html", {"msg": "用戶名或者密碼錯誤"})
導入 User from django.contrib.auth.models import User user = User.objects.create_user(username=username, password=password) user.save()
代碼塊介紹以後,進行return返回
return render(request, 'templates 下的文件夾名稱/文件名.html', {'名稱': 值}) return render(request, 'address/address_add.html', {'address_list': address_list})

能夠存在多個參數,goods 爲在app目錄下templates 中的 goods 文件夾
return render(request, 'goods/goods_show.html', {'goods': goods, 'store': store, 'nums':nums})
return redirect(reverse('名稱1:值1', kwargs={'參數名': 值})) html 中的數據 <a href="{% url '名稱1:值1' 空格 參數名 %}">內容</a> store_id = request.POST['goodsStore'] return redirect(reverse('store:detail_store', kwargs={'s_id': store_id})) 在這裏 'store:detail_store' 爲 反向解析 <a href="{% url 'store:detail_store' store.id %}">查看詳情</a>
from django.core.serializers import serialize type1 = models.GoodsType.objects.filter(parent=parent_id) return HttpResponse(serialize('json', type1)) #轉換成json類型的字符串
return redirect(reverse('shopcar:list_car')) <a href="{% url 'shopcar:list_car'%}" style="border: none;color: #00b7ee;width: 100px;height: 40px" >返回購物車</a>
from io import BytesIO def code(request): img, msg = utils.create_code() f = BytesIO() img.save(f, "PNG") # 將驗證碼的值存儲到session request.session["code"] = msg return HttpResponse(f.getvalue(), "image/png")

utils.py 文件,本身建立,若是須要能夠複製粘貼
import hmac import string import random from PIL import Image, ImageDraw, ImageFont from django.conf import settings # 密碼加密 def encryption(key): pwd = hmac.new(key.encode('utf-8'), settings.SALT_KEY.encode('utf-8'), 'MD5') return pwd.hexdigest() # 驗證碼 def getRandomChar(count=4): # 生成隨機字符串 # string模塊包含各類字符串,如下爲小寫字母加數字 ran = string.ascii_lowercase + string.ascii_uppercase + string.digits char = '' for i in range(count): char += random.choice(ran) return char # 返回一個隨機的RGB顏色 def getRandomColor(): return random.randint(50, 150), random.randint(50, 150), random.randint(50, 150) def create_code(): # 建立圖片,模式,大小,背景色 img = Image.new('RGB', (120, 30), (255, 255, 255)) # 建立畫布 draw = ImageDraw.Draw(img) # 設置字體 font = ImageFont.truetype('ARIALUNI.TTF', 25) code = getRandomChar() # 將生成的字符畫在畫布上 for t in range(4): draw.text((25*t+7, 0), code[t], getRandomColor(), font) # 生成干擾點 增長識別的難度 for _ in range(random.randint(99, 110)): # 位置,顏色 draw.point((random.randint(0, 120), random.randint(0, 30)), fill=getRandomColor()) # 生成干擾線 增長識別的難度 for _ in range(random.randint(8, 15)): begin = random.randint(0, 120), random.randint(0, 50) end = random.randint(0, 120), random.randint(0, 50) draw.line([begin, end], fill=getRandomColor()) # 使用模糊濾鏡使圖片模糊 # img = img.filter(ImageFilter.BLUR) return img, code

HTML 文件
此處只例舉一些基本語句,具體用法請查閱相關資料
{% block 名稱 %}{% endblock %}
進行繼承模板 {% extends '名稱.html' %}
{% csrf_token %} 服務器返回頁面的同時向前端返回一串隨機字符 post提交時服務器會驗證這串字符來確保用戶是在服務端返回的表單頁面中提交的數據
<tbody> {% for addr in address_list %} <tr> <td>{{addr.字段1}}</td> <td>{{addr.字段2}}</td> <td>{{addr.字段3}}</td> <td> {% if addr.is_default %} 默認地址 {% endif %} </td> </tr> {% empty %} <tr>提示信息</tr> {% endfor %} </tbody>
{% if request.user.username %} html 語句 {% else %} html 語句 {% endif %}
{{request.user.userinfo.nickname}}
<form action="{%url 'orders:order_done' %}" method="post">
<input type="hidden" name="sc" value="{{sc.id}}">
<span>{{shopcar.number}}</span>
下單時間:{{order.order_time|date:'Y-m-d G:i:s'}}<br>
{% if store.status == 0 %} <span style="font-size: 16px">店鋪狀態:正在營業</span> {% elif store.status == 1 %} <span style="font-size: 16px">店鋪休息</span> {% endif %}
{{goods.desc|truncatechars:22}} 截取前22個字符
{% for t in type1 %} <option value="{{t.id}}" >{{t.name}}</option> {% endfor %}

html 下還有不少的用法,此處僅列舉出了這些

django 項目獲取連接
連接:https://pan.baidu.com/s/1oWcHHbSR0JHmqr9qCzZGwA 提取碼:Hany