Django基礎之簡介(二)

三板斧

from django.shortcuts import render,HttpResponse, redirect

​ HttpResponsecss

# 返回字符串
urls:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'login/', views.login),


def login(request):
    return HttpResponse('Hello word~')

​ renderhtml

# 返回HTML頁面,而且能夠爲該html傳值
urls:
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'login/', views.login),
    url(r'reg/', views.reg),
]



def reg(request):
    user_dict = {'name':'jason','pwd':123}
    # return render(request,'reg.html')
    # 給模板傳值的方式1
    # return render(request, 'reg.html',{'xxx':user_dict})  # 將user_dict傳遞給reg.html頁面 頁面上經過xxx就可以獲取到該字典
    # 給模板傳值的方式2
    return render(request,'reg.html',locals())  # 會將當前名稱空間中全部的變量名所有傳遞給reg.html頁面
    # locals()  會出現效率問題,但仍是要是用

​ redirect前端

# 重定向 既能夠是咱們本身的路徑也能夠是網上的路徑
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'login/', views.login),
    url(r'reg/', views.reg),
    url(r'home/', views.home),
    url(r'index/', views.index),
]


def home(request):
    # return redirect('/index')
        return redirect('http://www.xiaohuar.com')

def index(request):
    return HttpResponse('index')


注意: 重定向的能夠是本身寫的,也能夠是第三方的。

django返回的都是HttpResponse對象python

咱們寫的視圖函數必須得有返回值mysql

靜態文件配置

用戶可以訪問到的全部資源,都是程序員提早爆露好的,若是沒有暴露,用戶永遠也訪問不到。程序員

用戶可以在瀏覽器中輸入網址訪問到相應的資源,前提是後端暴露了該資源接口。
在django中若是你想讓用戶訪問到對應的資源,咱們只須要在urls.py中設置對應關係,反過來若是我沒有在urls.py中開設資源 用戶就永遠就訪問不到對應的資源。
返回給瀏覽器的html頁面上全部的靜態資源 也須要請求後端加載獲取
一般咱們將網站所用到的html文件所有存放在templates文件夾下
網站用到的靜態資源所有存放到static文件夾下sql

靜態文件

​ 網站所用到的數據庫

​ 本身寫好的jsdjango

​ 本身寫好的CSSbootstrap

​ 第三方的框架 bootstrap fontwesome sweetalert

一般狀況下網站所用到的靜態文件資源,統一都放在static文件夾下

settings:
STATIC_URL = '/static/'  # 是訪問靜態資源的接口前綴
"""只要你想訪問靜態資源 你就必須以static開頭"""
# 手動配置靜態文件訪問資源
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    # os.path.join(BASE_DIR,'static2'),
] # (支持多個)

打開網頁,F12, 自定義關閉旁邊,Network, Disable cache (while DevTools is open),關閉緩存

接口前綴 動態解析

{% load static %}
<link rel="stylesheet" href="{% static'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

from表單

form是一個複雜的系統標籤,其內部又可包含不少的一些輸入標籤

例如input 輸入文本標籤 checkbox 多選標籤等等

form表單有幾個屬性咱們須要注意一下

  1:action屬性,裏面寫的是url連接,接就是表單提交的地址

  2:method屬性,裏面寫的是數據提交的方式,能夠寫入get或者post

  3:enctype屬性,提交數據的編碼格式

form表單中的標籤的先後臺交互

from表單上傳文件

form表單上傳文件
1.提交方式必須是post
2.須要將form標籤的enctype屬性由默認的urlencoded改成formdata

後端須要從request.FILES中獲取上傳的文件

django內部針對不一樣數據格式的數據 會解析到不一樣的方法中
request.GET
request.POST
request.FILES

form表單被咱們應用在先後臺交互的環節的,裏面的值能夠在後臺經過某些key取出來

下面就來說解不一樣標籤取值的方法

1. input 標籤
input標籤咱們最爲常見,裏面有三個屬性比較重要
  a. type 他是表明input的類型
  b. name 他就是後臺取值的依據(key)
  c. val 他是咱們輸入的值,也是後臺須要的值
  

而後咱們根據type的類型,又能夠把input進行細分

  a. text 表示普通的文本,明文輸入
  b. password 輸入的也是文本,密文輸入
  c. number 輸入的是數字,不是數字不讓輸入
  d. submit 提交按鈕,提交form表單的內容
  e. button 普通的按鈕
  f. radio 單選框,咱們須要注意的是單選框的全部的name值必須相同
      若是name不相同,就說明不在同一個選擇方位,也就不存在單選,而後想要在後臺取到他的值,

      你必須在定義的時候給附上一個值給value,這樣才能取到值
  g. checkbox 複選框,內容和單選框同樣
  h. file 選擇文件,能夠選擇文件提交給後臺

以上基本是input的全部類型,須要注意幾個點
  1.取值都是經過name進行取值,因此必須給name賦值
  2.文本類型想要附上初始值,直接在value中加入值就能夠
  3.選擇框若是想要默認選中誰,那就在誰的標籤中加入checked屬性

2. select 標籤
select標籤是一個下拉框的形式讓用戶進行選擇選項
因此select標籤中必須包含option標籤才能顯示屬性
形式爲:

而後select中有全局屬性name,這個name是後臺又來進行取值的
每一個option標籤的文本內容是顯示給用戶看的,咱們須要取的是option標籤中的value屬性,因此在開始必須給option的value賦值
後臺經過select的name取值,直接取到的就是對應option的value

若是咱們向讓他默認選擇某個option,能夠在option標籤中加入selected屬性,若是都不加,默認是顯示第一個

3. button 按鈕標籤
新出的標籤,與input中type爲button的按鈕同樣

4. textarea 文本框標籤

與input中的text同樣都是輸入文本的,可是textarea標籤沒有字數的限制,而且輸入框能夠拖拉。

from表單 action參數能夠寫的形式
  1. 若不寫 :默認朝當前地址提交
  2. 只寫後綴/index/
  3. 寫全路徑

from表單默認朝後端提交的方式 默認是get請求

​ get請求攜帶參數的方式,是在url後面?

​ url ?username=admin&password=123

​ 缺點:

  1. 不安全
  2. get請求攜帶的參數有大小限制

若是前期要提交post請求 就去settings中註釋掉一箇中間件

request對象及方法先後端數據交互

如何獲取請求方式

獲取post請求攜帶的數據
request.POST
獲取get請求攜帶的數據:request.GET
get和post在後端獲取用戶數據的時候 規律是同樣的
<QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
tank <class 'str'>
123 <class 'str'>
request.POST.get('username') 默認只取列列表的最後一個元素
若是你想將列表完整的取出 你必須用getlist()

request.GET  # 你就把它當成一個大字典 裏面放的是get請求攜帶過來的數據
request.POST  # 你就把它當成一個大字典 裏面放的是post請求攜帶過來的數據
"""上面的大字典 全部的value都是一個列表"""
    
request.GET.get('key')  # 默認取的是列表的最後一個元素 並非直接將列表取出
request.GET.getlist('key')  # 直接將value的列表取出


request.POST.get('key')  # 默認取的是列表的最後一個元素 並非直接將列表取出
request.POST.getlist('key')  # 直接將value的列表取出

pycharm鏈接數據庫(pycharm充當數據庫的客戶端)

點擊database,添加數據庫

Django鏈接數據庫

Django自帶一個小型的sqlite3數據庫....該數據庫功能不是很強大 尤爲是對日期格式的數據 不是很兼容

​ Django鏈接MySQL

​ 1. 配置文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # 指定數據庫
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 究竟是用哪一個庫
     'USER':'root',
   'PASSWORD':'root',
   'HOST':'127.0.0.1',
   'PORT':3306,
   'CHARSET':'utf8'
}
}

如今已經再也不使用MySQLdb模塊,可是默認仍是使用MySQLdb 鏈接數據庫,因此告訴Django不要使用MySQLdb,而是改用pymysql 鏈接

在項目名稱下邊的__init__.py也能夠在應用名下面的__init__.py文件中指定
import pymysql
pymysql.install_as_MySQLdb()

Django orm簡介

​ orm對象關係映射

​ 類 數據庫的表

​ 對象 表的記錄

​ 對象獲取屬性 記錄的某個字段對應的值

優勢: 可以讓一個不會數據庫操做的人也可以簡單快捷的去使用數據庫

缺點: 因爲封裝程度過高,可能會致使sql語句的執行效率變低

有時候結合項目需求可能須要你手寫sql語句

注意事項:

1. django的orm不會自動幫你建立庫,須要你手動指定一個django項目用一個數據庫
2. 表會自動幫你建立,你只須要書寫符合Django orm語法的代碼便可
from django.db import models
# Create your models here.
class Userinfo(models.Model):
# 設置id字段爲userinfo表的主鍵  id int primary key auto_increment
id = models.AutoField(primary_key=True) # 在django中 你能夠不指定主鍵字段 django orm會自動給你當前表新建一個名爲id的主鍵字段    # 設置username字段  username varchar(64)  CharField必需要指i定max_length參數
username = models.CharField(max_length=32)  # 在django orm中 沒有char字段  可是django 暴露給用戶 能夠自定義char字段    # 設置password字段  password int
password = models.IntegerField()

數據庫遷移(同步)命令:

  1. python manage.py makemigrations # 不會建立表 僅僅是生成一個記錄 將你當前的操做記錄到一個小本本上(migrations文件夾)

  2. python manage.py migrate # 將你的orm語句真正的遷移到(同步)到數據庫中

  3. 只要你在models.py中修改了跟數據庫相關的代碼 你就必須從新開始執行上面兩條命令

當你第一次執行上面兩條命令的時候 django會自動建立不少張表 這些表都是django默認須要用到的表
你本身寫的模型類所對應的表 表名有固定格式
應用名_表名

字段的增刪改查

增:

在項目的modles文件夾下
 phone = models.BigIntegerField(default=110)  # 新增的字段 能夠提早設置默認值 
addr = models.CharField(max_length=64,null=True)  # 新增的字段 能夠設置爲空

新增的字段
1.直接提供默認值 default
2.設置改字段能夠爲空 null=True
注意的是 不要輕易的註釋models.py中任何跟數據庫相關的代碼
主要是跟數據庫相關的代碼 你在處理的時候必定要當心謹慎

數據的增刪改查

表記錄的增改查:

能夠再客戶端瀏覽器顯示

{# 模板語法註釋 #},不能在網頁顯示,只能在後端顯示,

數據的查:

​ get()

​ 1. 條件存在的狀況下,獲取的直接是數據對象的自己

​ 2. 條件不存在的狀況下,會直接報錯,因此不推薦使用get方法查詢數據

filter()
  1. 條件存在的清華況下獲取的是一個能夠當作列表的數據,列表裏面放的纔是一個個數據
    1. 條件不存在的狀況下,並不會報錯,會返回一個能夠當作空列表的數據
    2. filter括號內能夠寫多個參數逗號隔開這多個參數在查詢的時候 是and關係
  2. filter的結果支持索引取值 可是不支持負數 而且不推薦你使用索引 推薦你使用它封裝好的方法 first取第一個數據對象數據的增

數據的增

##### 1. create()

1. 括號內寫關鍵字參數的形式,建立數據
        2. 該方法會有一個返回值,返回值就是當前的對象前身。

##### 2. 利用對象點方法的方式

user_obj = User(username='jason')

user_obj.save()  # 將當前對象保存到數據庫中

改:

def edit_user(request):
  # 1.如何獲取用戶想要編輯的數據
  edit_id = request.GET.get('edit_id')
  if request.method == 'POST':
    # 將用戶新修改的全部的數據
    username = request.POST.get("username")
    password = request.POST.get("password")
    """POST中也是能夠獲取GET請求攜帶的參數""" 
    # 去數據庫中修改對應的數據 
    # 方式1:        models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password)# 批量更新
    # 方式2: 獲取當前數據對象 而後利用對象點屬性的方式 先修改數據  而後調用對象方法保存
    # 不推薦你使用第二種方式  效率低   挨個從新寫入一遍
     edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()  # pk可以自動幫你查詢出當前表的主鍵字段名
       edit_obj.username = username
       edit_obj.password = password
       edit_obj.save()
        """update方法會將filter查詢出來的queryset對象中全部的數據對象所有更新""" 
        # 跳轉到數據展現頁面
        return redirect('/userlist')
      # 2.根據主鍵值去數據庫中查詢出當前對象 展現給用戶看
      edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
      # pk可以自動幫你查詢出當前表的主鍵字段名 
      # 3.將查詢出來的數據對象傳遞給前端頁面 展現給用戶看
      return render(request,'edit_user.html',locals())

刪:

def delete_user(request):
  # 獲取想要刪除的數據id 直接刪除
  delete_id = request.GET.get('delete_id')    models.Userinfo.objects.filter(pk=delete_id).delete()  # 批量刪除
  return redirect('/userlist')
相關文章
相關標籤/搜索