Django單表開發流程css
1、建立Django項目:html
(1)cmd下python
1.查看Django版本:python -m django --versionmysql
2.建立Django項目:django-admin startproject mysite(cd到你要建立的文件下)git
3.切換到Django項目目錄下,啓動Django:python manage.py runserversql
(2)pycharm下數據庫
1.New Project:建立新的Django項目(建議在more setting 中,可設置應用application name)django
2、設置settings.py文件:app
(1)修改TEMPLATES中的'DIRS':函數
1 os.path.join(BASE_DIR, 'templates')
(2)若是想打印orm轉換過程當中的sql,須要在settings中進行以下配置:
1 LOGGING = { 2 'version': 1, 3 'disable_existing_loggers': False, 4 'handlers': { 5 'console':{ 6 'level':'DEBUG', 7 'class':'logging.StreamHandler', 8 }, 9 }, 10 'loggers': { 11 'django.db.backends': { 12 'handlers': ['console'], 13 'propagate': True, 14 'level':'DEBUG', 15 }, 16 } 17 }
(3)把settings自帶的DATABASES替換成本身的:
DATABASES = { 'default':{ 'ENGINE': 'django.db.backends.mysql', # 改爲所用的數據庫
'NAME':'library', # 要鏈接的數據庫,鏈接前在帳號下須要建立好數據庫
'USER':'root2', # 鏈接數據庫的用戶名
'PASSWORD':'123', # 鏈接數據庫的密碼
'HOST':'127.0.0.1', # 鏈接主機默認本機
'POST':3306 # 端口 默認3306
} }
(4)若是INSTALLED_APPS裏沒有應用的名稱,須要手動添加「application name」
(5)管理不一樣應用的css/js等靜態文件:在一個應用裏建立static文件夾,用於管理文件
結構:
settings.py:添加代碼
STATICFILES_DIRS=[ os.path.join(BASE_DIR, "static"), ]
3、爲應用配置models.py
(1)models.py用於建立表結構:以後表的增刪改查所有由該類的對象進行操做
1 from django.db import models #必須導入 2
3 # Create your models here.
4
5 class Book(models.Model): # 類必定要繼承models.Model 6 id = models.AutoField(primary_key=True)#AutoField:自增;primary_key:主鍵
7 title = models.CharField(max_length=32)#CharField:字符串
8 pub_date = models.DateField() 9 price = models.DecimalField(max_digits=8, decimal_places=2)#相似於double,精讀高的浮點數,max_digits最大位數(包括decimal小數部分),decimal小數部分
10 publish = models.CharField(max_length=32) 11
12 #打印對象,默認打印一長串object屬性
13 #__str__當對象生成的時候自動觸發
14 def __str__(self): 15 return self.title # 打印對象的QuerySet類型
(2)必定要在項目全局文件中的__init__中設置:
1 import pymysql 2
3 pymysql.install_as_MySQLdb()
(3)建立完以後必定要運行:進行python語句和sql語句的轉換
1 兩條數據庫遷移命令便可在指定的數據庫中建立表 : 2 python manage.py makemigrations 3 python manage.py migrate
4、urls裏配置路由
(1)導入建立應用的views
1 from django.urls import path, re_path 2 from app01 import views
(2)配置路由
urlpatterns = [ path('admin/', admin.site.urls), path('book/', views.book), path('addbook/', views.addbook), re_path('^$', views.book), re_path(r"book/(\d+)/delete", views.delbook) , # (\d+)捕獲數字 delbook(request,數字)
re_path(r"book/(\d+)/change", views.changebook) # (\d+)捕獲數字 delbook(request,數字)
]
(3)若是有多個應用,則應該使用分發:讓每個應用有單獨本身的url路徑
第一步:爲每個應用建立一個urls.py進行分流
第二步:在全局urls中進行分發:
1 #分發:
2 #讓每個應用有單獨本身的url路徑
3 re_path(r"app01/",include(("app01.urls","app01"))), # include(('',''))建立兩個房間,第二個參數:namespace用來區別一樣的urls
4 re_path(r"app02/",include(("app02.urls","app02"))), 5
6 #去掉app01/的分發:
7 re_path(r"^",include("app01.urls")), 8
9 path("articles/<mm:month>/", views.month)
5、建立對應的視圖函數
(1)導入必要的模塊
from django.shortcuts import render, HttpResponse, redirect
(2)視圖函數都須要有返回值return,一般返回值有三種
1 return render(request, 'changebook.html',{"book_obj":book_obj}) # 給html傳入值須要遵循格式:{"book_obj":變量} 2 return HttpResponse("Hello World") 3 return redirect("/book") # 進行重定向,再也不須要在form表單action裏進行定義
(3)獲取input標籤裏的值(input標籤裏必定要定義name="",才能從請求中根據name找到對應的value):
1 if request.method == 'POST': # 判斷請求方式
2 title = request.POST.get("title") 3 price = request.POST.get("price") 4 pub_date = request.POST.get("pub_date") 5 publish = request.POST.get("publish") 6
7#添加表數據,須要導入表對象Book
8 book_obj = Book.objects.create(title=title, price=price, pub_date=pub_date, publish=publish)
(4)表對象的各類obj.object.操做:
首先導入須要用到的表:
from app01.models import Book
從表中拿到input收集到的各類value
book_list = Book.objects.all() # [obj1,obj2....]
經過render傳入變量
return render(request,'book.html',locals()) #local()傳入該函數局部變量
(5)模板語法
html頁面for循環添加table-tbody元素(元素由render傳入的變量提供)
1 <tbody>
2 {% for book in book_list %} 3 <tr>
4 <td>{{ book.title }}</td> #經過模板語法{{}}調用表對象的屬性
5 <td>{{ book.price }}</td>
6 <td>{{ book.pub_date|date:"Y-m-d" }}</td> # 經過過濾器|date:"參數"改變日期格式
7 <td>{{ book.publish }}</td>
8 <td>
9 <a href="/book/{{ book.pk }}/delete" class="btn btn-danger">刪除</a> # pk爲表的自增主鍵,自動查找
10 </td>
11 <td>
12 <a href="/book/{{ book.pk }}/change" class="btn btn-info">編輯</a>
13 </td>
14 </tr>
15 {% endfor %} 16 </tbody>
點擊刪除按鈕刪除數據:經過a標籤跳轉到帶有對應ID的數據庫數據url(全局url路由器裏)一般在網頁上對數據進行操做都須要定義一個url(r"xx/(\d+)/xxx")格式專門用於操做
re_path(r"book/(\d+)/delete", views.delbook) , # (\d+)捕獲數字 delbook(request,數字)
經過模板語法進行刪除;再返回該頁面(redirect)
1 def delbook(request, id): 2
3 Book.objects.filter(id=id).delete() # 刪除book.pk對應的ID的數據
4
5 #刪除後進行重定向須要導入redirect
6 return redirect("/book")
修改數據:與刪除同樣拿到數據惟一的ID,進行修改
1 def changebook(request, id): 2 #a標籤進入的頁面默認爲get
3 #無論是什麼請求進入的changebook都獲取book_obj
4 book_obj = Book.objects.filter(id=id).first() #first() 拿到queryset的第一個對象
5
6 if request.method == "POST": 7 title = request.POST.get("title") 8 price = request.POST.get("price") 9 pub_date = request.POST.get("pub_date") 10 publish = request.POST.get("publish") 11
12 #當進入編輯頁面後點擊提交,進入post,對數據進行修改
13 book_obj = Book.objects.filter(id=id).update(title=title, price=price, pub_date=pub_date, publish=publish) 14
15 return redirect("/book") 16
17
18 return render(request, 'changebook.html',{"book_obj":book_obj})
總結:
1.要在html文件里根據數據庫生成標籤需熟練運用模板語法for:
1 {% for person in person_list %} # 循環對象列表2 <p>{{ forloop.counter }} {{ person.name }},{{ person.age }}</p> # 兩個變量之間可設置不一樣的分隔符,forloop爲索引
{% empty %} #若是列表爲空就打印empty後的標籤內容5 <p>列表爲空</p> 6 {% endfor %}
2.在登陸註冊界面中,常常運用模板語法if
1 {% if user %} 2 <p>
3 <a href="">hi {{ user }}</a>
4 <a href="">註銷</a>
5 </p>
6 {% else %} 7 <p>
8 <a href="">登錄</a>
9 <a href="">註冊</a>
10 </p>
11 {% endif %}
3.一般按鈕的跳轉頁面,在views.py中return redirect("/url/")進行重定向 / a標籤訂義的按鈕使用href="/url/"進行頁面跳轉
4.有按鈕的地方就有post訪問,則視圖函數中一般會進行if request.method對請求進行判斷,讓網頁return到不一樣的頁面