Django 是一個web開發框架也是一個服務端開發框架
安裝:pip install django==2.1.0
驗證安裝是否成功,只要不提示不存在就證明安裝成功:django-admin
web開發模式有一個MVC
- M就是model---操作數據庫的
- V就是view----操作視圖
- C就是controller----控制邏輯
django的開發模式是MTV
- M就是model---操作數據庫的
- T就是template----操作視圖
- V就是view----控制邏輯
如何使用命令創建項目:
- 創建一個名字為test的項目 :django-admin startproject test
- 創建完成后cd test進入會有一個manage.py文件是用來啟動項目的,運行即可啟動項目
- 在test項目里創建子項目user :python manager.py startapp user
- 啟動test項目:python manage.py runserver(啟動后默認端口號是8000,如想更改端口號:python manage.py runserver 0:81111)
創建好django項目后,如果pycharm能識別這是一個django項目,那么我們可以使用tools->Run manage.py Task...啟動,這樣我們執行命令時就不需要加python manage.py了,例如創建子項目直接startapp user即可。
如何使用pycharm創建django項目
1、在pycharm里創建一個新項目
2、創建完成后即可啟動項目,有兩種方式
-
- 第一種通過命令:python manage.py runserver啟動,需進入到項目目錄下才可以啟動
- pycharm識別出這是一個django項目,點擊右側啟動按鈕即可啟動項目,后面的小蟲子是debug模式運行
3、啟動后訪問http://127.0.0.1:8000,頁面展示如下:
4、項目基本配置
-
- settings.py里是項目的基本配置,連接數據庫,redis都是在這里配置。
- 文件77行DATABASES里就是配置數據庫的,默認使用的是sqlite數據庫,如果以后想要改數據庫的話,在這里修改。
- 如果以后想用mysql數據庫的話,除了在DATABASES這里配置mysql數據庫外,還需在與settings.py文件同級的__init__.py里增加以下代碼才可用。
import pymysql pymysql.install_as_MySQLdb()
- 文件里的TEMPLATES下的DIRS里是配置templates文件夾下html模版的路徑,如果你將html文件放在別的文件夾下,需在這里配置html模版的路徑。
- 我們可以看到訪問的頁面都是英文的,要想顯示中文,改LANGUAGE_CODE = 'zh-Hans', TIME_ZONE是時區,我們改成亞洲的時間TIME_ZONE = 'Asia/Shanghai' 否則以后存儲到數據里的時間會不對,USE_TZ = False 表示使用當前設置的時區,修改完成后再次訪問頁面,即顯示中文。
- 總結:創建一個diango項目后setting需修改3處位置 LANGUAGE_CODE = 'zh-Hans' , TIME_ZONE = 'Asia/Shanghai' , USE_TZ = False 。
- settings.py里是項目的基本配置,連接數據庫,redis都是在這里配置。
5、目錄介紹
-
- templates里是放html文件
- 新建一個static文件夾,用來放靜態文件,以后在html中引用時需在settings.py里配置一下
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
#用靜態文件的配置。 #這里STATICFILES_DIRS是一個元祖,元祖里只有一個元素的時候要記得加,號 - 創建的子項目user文件夾下有一個views.py,這里是專門寫邏輯的
- urls.py文件是配置要訪問的url路徑的(url中指向某個函數需先import導入該函數),
這里介紹兩種方法 第一種:直接指定url路徑 第二種:在url后指定一個name=**
適用於url路徑經常變更的,這樣寫以后url變更時曾經寫在html里對應的url路徑就不需要跟着一一修改了。
在html中用的時候直接使用這個name(原來是/detail?***,修改后用法:{% url 'xiangqing' %}?***) from user.views import index,detail urlpatterns = [ path('index/', index), # 第一種 path('detail/', detail,name='xiangqing'), #第二種 ]
html文件中對應兩種方法的使用:
第一種:<a href="/detail?id={{ article.id }}">第二種:<a href="{% url 'xiangqing' %}?id={{ article.id }}">
如何將寫的東西展示到頁面
如果寫一個東西想在頁面上訪問有三個步驟
- 首先要有一個html,
- 其次要在views.py里寫實現的方法,
- 在urls.py里配置要訪問的url。
反過來請求某一個鏈接的時候首先是在urls.py里查找是否有匹配的url,匹配到以后看該url對應的函數是什么(url中指向某個函數需先import導入該函數),再在views.py里查找該函數對應的內容及映射的是哪個html,
django的模版語言在html里要想取一個list的下標用.取,例如**.0,引用的變量的時候還是{{}}
循環的是用{% for * in * %} {% endfor %}
如何建表
model是操作數據庫的,所以我們需要在model.py下寫表結構,使用的是Django自帶的db.sqlite3數據庫
- 首先在model.py里定義表結構(表里有id的話id不需要定義,會被自動創建)
- 第二步是生成表結構,命令:python manage.py makemigrations 。生成后會在子項目下產生一個migrations文件夾,里面是根據我們定義的類來生成的表結構的py文件,
- 第三步同步表到數據庫,命令:python manage.py migrate
(如果pycharm能識別這是一個django項目,那么我們可以使用tools->Run manage.py Task...啟動,這樣我們執行命令時就不需要加python manage.py了,例如生成表結構時直接在啟動台里輸入makemigrations即可)
例子:models.py
category表結構
id
name
create_time
update_time
from django.db import models # Create your models here. class Category(models.Model): #建一個類繼承model name = models.CharField(verbose_name='分類名',max_length=50,unique=True,db_index=True) #CharField是字符串類型,必須指定最大長度,unique=True表示字段不能重復,db_index表示索引 create_time = models.DateTimeField(verbose_name='創建時間',auto_now_add=True) #auto_now_add=True表示創建的時候會自動記錄當前的時間 update_time = models.DateTimeField(verbose_name='修改時間',auto_now=True) #auto_now=Tru表示修改的時候會自動給更新時間 is_delete=models.BooleanField(verbose_name='是否刪除',default=False)
models.TextField() #是超文本類型,存的內容非常多的時候用這個
models.ForeignKey() #外鍵,一對多的時候會用到 class Meta: db_table = 'category' # 定義表名,如果不定義表名默認生成的表名是“子項目名+定義的類名” ordering = ['-create_time'] #按什么排序,默認是升序,如果想要降序就加一個-號 verbose_name='文章分類' #加上這個后台管理頁面表名顯示為中文,設置verbose_name主要是為了在后台管理頁面展示為中文,方便操作。 verbose_name_plural=verbose_name #英文是有復數的中文沒有,加上這個中文后就不顯示s了。如果就想顯示英文,注釋這兩行即可。 def __str__(self): #這兩句的目的是在后台管理工具中把添加的數據顯示為數據庫表里name的名字 return self.name
建表時如果表結構是帶有上傳圖片的,有三步需要額外操作的
- 使用ImageField需要安裝pip install pillow才可以使用,否則會報錯
- upload_to指定圖片放置的目錄
- 在settings.py文件中指定路徑MEDIA_ROOT,否則不知道要把目錄放到哪,
models.py
img=models.ImageField(verbose_name='文章圖片',upload_to='article_img',default='images/1.jpg')
#使用ImageField需要安裝pip install pillow才可以使用,upload_to指定將圖片放到某個目錄下,如果目錄不存在會被自動創建。
#upload_to='article_img/%Y/%m' 這么寫是說創建目錄時帶上年月避免混淆
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'static') #上傳文件的路徑,這里指定在static文件夾下
第三步完成后我們即可在數據庫中查看創建的表,復制db.sqlite3數據庫的路徑,打開連接數據庫的工具Navicat,連接時類型選擇‘現有數據庫文件’,復制上數據庫路徑連接即可,如下圖
使用pycharm自帶的數據連接方法:
在pycharm里選擇Database->點擊+號->DateSource->選擇我們的數據庫sqlite,出現下圖,在file里復制上數據庫的鏈接地址即可連接成功,如果是首次連接頁面下方會提示下載driver,下載后即可連接成功
表創建完成后,要想給表里增加數據,有2種方法:
- 數據庫表里直接添加數據
- django自帶一個后台管理頁面工具,可在這里對自己創建的表進行增刪改查
要想使用django自帶的后台管理工具操作數據庫,需做如下配置:
- 在urls.py里有一個配置的path是admin,只要訪問url后面加admin即可打開后台管理工具頁面
- 創建后台管理工具的超級用戶 python manage.py createsuperuser
- 在子項目的admin.py中做簡單的配置,配置完成后即可在頁面對表進行操作:
-
- 想在后台顯示某個表,首先要導入models
- 配置想在后台頁面顯示的數據庫表名
例子:我們前面創建里一個表category
from django.contrib import admin # Register your models here. from . import models #想在后台顯示某個表,首先要導入models admin.site.register(models.Category) #配置這個后可以直接在頁面操作數據庫 admin.site.register(models.Article)
如何將創建的數據展示到頁面中
- 邏輯要寫在views.py
- 首先查數據需在views.py里導入models,查的數據是哪個表的就導入哪個表
- 如何在數據庫中查數據,使用類名.objects.all()就表示查所有的數據
- 數據要展示到頁面的哪一塊?在html文件中找到相對應頁面的位置,循環剛才查到的數據,取這個字段展示到頁面即可(需注意的是:循環的內容實際是一個對象,要想將對象對應的字段展示到頁面,要用**.**,即循環對象.字段名)
例子: views.py from .models import Category def index(request): catagories=Category.objects.all() #all指查這個表里的所有數據,相當於這個sql語句select * from category print(catagories) #可以看到打印出來的實際是一個對象 return render(request, 'index.html')
例子: index.html # django里循環用的是{% for ** %} {% endfor %} 取變量用{{}} # <ul id="starlist"> {% for n in nav %} <li><a href="index.html">{{ n.name }}</a></li> {% endfor %} </ul>
如何操作數據庫的增刪改查
- 首先import django,os
- 指定django的配置文件在哪里,配置自己項目名下的settings
- django.setup()
- 導入models下要操作的數據庫表
- 此時就可以操作數據庫啦
import django,os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_test.settings') #指定django的配置文件在哪里,配置自己項目名下的settings django.setup() from user.models import Category,Article # 增加 # 方法一:create方式 # Category.objects.create(name='Mysql') #新增數據 # 同樣也可以直接用 # c_obj=Category.objects.create(name='Mysql') # print(c_obj.name) # print(c_obj.create_time) # print(c_obj.update_time) # 方法二:實例化方式創建 # obj=Category(name='Oracle') # obj.save() # 查詢 Category.objects.all() #查詢所有的 print(Category.objects.get(id=1)) #只獲取一條,get只能返回一條數據,多條會報錯 print(Category.objects.get(name='Mysql')) #獲取一條 Category.objects.filter(id__gt=1) #id大於1,filter是查詢多條數據,返回一個list Category.objects.filter(id__lt=1) #id小於1 Category.objects.filter(id__gte=1) #id大於等於1 Category.objects.filter(id__lte=1) #id小於等於1 data=Category.objects.filter(id__gt=1,name="首頁") #多個條件用,號隔開,是and關系 print(data.first()) #取第一條數據,也可以用下標方式取:data[0] print(data.last()) #取最后一條數據 Category.objects.filter(name__endswith='XX') #以什么結尾 Category.objects.filter(name__startswith='XX') #以什么開頭 Category.objects.exclude(name="首頁").filter(id__gte=1) #不等於 Category.objects.filter(name__startswith='李').exclude(sex="女")#還可以這樣連用:先找到姓名是以李開頭的在排除sex=女的。 print(Category.objects.filter(name__contains='L') )#包含 print(Category.objects.filter(name__icontains='l'))#不區分大小寫包含 print(Category.objects.filter(name__in=['首頁','Mysql','python'])) #or、!=、in、like select * from xxx like '%李%'; #修改 # Category.objects.update(is_delete=True)#修改全表 # obj = Category.objects.get(id=1)#改某條數據 # obj.is_delete = False # obj.save() #實例化方式修改的數據,要save一下才可以成功 # Category.objects.filter(id__in=[2,3,4]).update(is_delete=False) #一次性修改多條數據 #刪除 # Category.objects.all().delete()#刪除全表 # # obj = Category.objects.get(id=1)#刪某條數據 # obj.delete() # obj.save() # # Category.objects.filter(id__in=[2,3,4]).delete(is_delete=False) # 排序 Category.objects.all().order_by("-create_time") #按照create_time降序排列,如果有多個就,號分隔 # Category表和article表是一對多的關系 c_obj = Category.objects.get(id=1) # 1->多關系,1是Category表,如果想查某一個分類下的文章,首先查出這個分配 print(c_obj.article_set.count()) #article是多的那張表, print(c_obj.article_set.all()) #.all是取所有的文章 #多 article = Article.objects.get(id=1) #想知道某一個文章是在哪個分類下,需先獲取到這個文章 print(article.category.name)
# 或
# from django.db.models import Q
# r = Article.objects.filter( Q(category_id=1) | Q(category_id=2) )