Django(二)

Django(二)

img

靜態文件

什麼是靜態文件?

  • 靜態文件:寫好的文件不會動態改變的文件資源,比如CSS文件,Js文件,圖片文件,第三方框架等·····
  • 墨守成規的將這些文件放在自創static文件夾中,在靜態文件夾中創建CSSJSimgothers文件夾·····

配置靜態文件,拿第三方框架bootstrap來舉例,如果用到靜態文件,需要在settings.py配置,配置好bootstrap的絕對路徑只從寫根目錄寫起就ok啦!

再需要寫靜態文件,在static中寫就🆗了!

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

示例:登錄

'''urls.py'''
from django.contrib import admin
from django.urls import path
from app01 import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),

]

'''views.py'''
from django.shortcuts import render

# Create your views here.
def  login(request):
    return render(request,'login.html')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/CSS/bootstrap.min.css">
    <script src="/static/JS/bootstrap.min.js"></script>
    <script src="/static/JS/jQuery3.6.js"></script>
</head>
<body>
    <div class="container">
        <div class="row">
            <h1 class="text-center">用戶登錄</h1>
            <div class="col-md-8 col-lg-offset-2">
                <form>
  <div class="form-group">
    <label for="exampleInputEmail1">Email address</label>
    <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
  </div>
  <div class="form-group">
    <label for="exampleInputPassword1">Password</label>
    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
  </div>


  <button type="submit" class="btn btn-primary btn-block">Submit</button>
</form>
            </div>
        </div>
    </div>
</body>
</html>

ps:配置靜態文件完成後,那麼在static文件下的文件都可以通過路徑來訪問到,eg:127.0.0.1:8000/static/a.txt

ps:如果Django主頁面不能訪問了,在urls.py文件中寫一個默認的對應關係補充

image

靜態文件配置及訪問順序

靜態文件

STATIC_URL = '/static/'  # 介面前綴,不是文件名,類似"令牌"

'''
如果你想要訪問靜態文件資源必須以static開頭,如果寫了介面前綴之後,下面的靜態配置文件下的文件都能夠訪問
'''
# 靜態文件配置,可以寫多個,訪問的順序是從上往下依次查找
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
]

動態解析

涉及到介面前綴的修改繁瑣的問題,那麼現在使用動態解析的語法來實現,修改了介面前綴也能夠動態解析,從而不需要挨個文件的修改!

<!--靜態配置-->
<script src="/static/JS/bootstrap.min.js"></script>
<script src="/static/JS/jQuery3.6.js"></script>

<!--上下對比-->

<!--動態解析配置-->
{% load static%}
    <link rel="stylesheet" href="{% static '\CSS\bootstrap.min.css' %}">
    <script src="{% static '\JS\bootstrap.min.js' %}"></script>

image

request對象方法

提交表單出現403錯誤,如何解決?

image

settings.py文件注釋掉'django.middleware.csrf.CsrfViewMiddleware',就可以了

request方法

  • request.method:獲取當前請求方法
  • request.body:以二進位的形式返回用戶提交的數據
  • request.POST:以字典的形式返回用戶提交的數據
from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def  login(request):
    print(request.method, type(request.method))  # GET <class 'str'>
    if request.method=='POST':
        return HttpResponse('POST請求返回結果!')
    return render(request,'login.html')   # GET請求返回頁面

注意:request.POST返回的字典用get方法獲取列表形式的value,返回的是字元串,get方法只會取列表的最後一個元素

# 在獲取用戶多選或者提交的資訊是多條,返回在一個列表內如何獲取用戶數據呢?
使用request.POST.getlist方法,返回一個列表,就不再使用get方法了

def  login(request):
    print(request.method, type(request.method))  # GET <class 'str'>
    print( request.POST)
    print( request.POST.get('Email'))
    print( request.POST.getlist('Email'))
    if request.method=='POST':
        return HttpResponse('POST請求返回結果!')
    return render(request,'login.html')   # GET請求返回頁面

GET請求方式的方法是一樣的

如何獲取URL?後面的參數?

request.GET方法:和request.POST方法是一樣的,返回字典

request.GET.get(k):獲取字典的value,返回字元串

request.GET.getlist(k):獲取用戶數據,獲取到整個列表

文件對象如何獲取??

針對錶單提交的文件對象,如何獲取?這裡不能使用request.POST或者request.GET方法,使用request.FILES方法,返回結果看成字典即可

  • 獲取表單提交文件對象的方法:request.FILES

方法有了,返回的是空字典,在表單中添加enctype參數,再提交就可以獲取到文件對象

<form action="" method="post" enctype="multipart/form-data">

Django連接MySQL

Django默認使用的資料庫是sqlite3,這裡介紹如何使用Django連接MySQL資料庫

1、修改配置文件

# 默認的情況settings.py文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# 修改配置文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '資料庫',
        'HOST':'ip地址',
        'PORT':3306,
        'USER':'用戶名',
        'PASSWORD':'密碼',
        'CHARSET':'utf8'
    }
}
# 資料庫使用是提前創好的!!!

2、在項目文件夾或應用文件夾中的__init__.py文件書寫固定的程式碼

image

'''__init__.py'''
import pymysql
pymysql.install_as_MySQLdb()

如果報錯: query = query.decode(errors='replace') AttributeError: 'str' object has no attribute 'decode'

解決辦法:query = query.decode(errors='replace')提換成query = errors = 'replace'


Django ORM

ORM:對象映射關係程式

通過orm將程式語言的對象模型和資料庫的關係模型建立映射關係,這樣我們在使用程式語言對資料庫進行操作的時候可以直接使用程式語言的對象模型進行操作就可以了,而不用直接使用sql語言;

python與MySQL映射關係

Python 映射 MySQL
——->
對象 ——-> 表裡面的數據
對象點屬性 ——-> 欄位對應的值

ORM實操之資料庫遷移

我們的模型類需要寫在應用下的models.py文件中

# SQL原生語句和ROM創建的區別

class User(models.Model):
        # id int primary key auto_increment
        id = models.AutoField(primary_key=True)
        # name varchar(32)
        name = models.CharField(max_length=32)  # CharField必須要加max_length參數
        # age int
        age = models.IntegerField()

✨✨✨資料庫遷移命令(重點)

  • 只要修改了models.py文件執行了和資料庫相關的命令,就重新執行下面這兩條命令:python3 manage.py makemigrations、python3 manage.py migrate
  • 或者打開Tools,點擊RUN manage.py Task,輸入makemigrations
 1.將資料庫修改操作先記錄到"本本"(對應應用下的migrations文件夾)
    python3 manage.py makemigrations
# 執行完,產生一個文件,用來記錄 
2.真正的執行資料庫遷移操作,同步到資料庫
	python3 manage.py migrate
# 執行完會在資料庫中產生Django所需的依賴表,自動創建的 
# 自己創建的表user以'應用名_表名'的形式創建,app01_user

✨✨不指定id欄位和主鍵等,ORM會自動創建id

# 如果你不指定主鍵 那麼orm會自動幫你創建一個名為id的主鍵欄位
class user(models.Model):
    username = models.CharField(max_length=32)
    
# 就不用寫id了···,需要訂製id,就寫上~

ORM實操之欄位的修改

# 原來的表
class user(models.Model):
     username = models.CharField(max_length=32)
        
# 增加欄位(兩種方法)
	password = models.IntegerField('密碼',null=True)  # 該欄位可以為空
    is_delete = models.IntegerField(default=0)   # 默認值
    
# 修改欄位
直接改程式碼,然後執行makemigrations,資料庫遷移
# 刪除
直接刪除或者注釋掉程式碼,然後執行makemigrations,資料庫遷移

ORM實操之數據的增刪改查

# 1.查詢數據
# select * from user where name=username;
user_obj = models.User.objects.filter(name=username).first()

# 2.添加數據
# insert into user(name,pwd) values(username,password);
models.User.objects.create(name=username,pwd=password)

# 3.查詢所有的數據
# select * from user;
models.User.objects.all()  # [obj1,obj2,obj3,obj4]

# 4.修改數據
models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()

# 5.刪除數據
models.User.objects.filter(id=delete_id).delete()