初識Django-前后端不分離(一)


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----控制邏輯

如何使用命令創建項目:

  1. 創建一個名字為test的項目 :django-admin startproject test  
  2. 創建完成后cd test進入會有一個manage.py文件是用來啟動項目的,運行即可啟動項目
  3. 在test項目里創建子項目user :python manager.py startapp user
  4. 啟動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 。

 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 }}">

       

 如何將寫的東西展示到頁面

如果寫一個東西想在頁面上訪問有三個步驟

  1. 首先要有一個html,
  2. 其次要在views.py里寫實現的方法,
  3. 在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數據庫

  1. 首先在model.py里定義表結構(表里有id的話id不需要定義,會被自動創建)
  2. 第二步是生成表結構,命令:python manage.py makemigrations  。生成后會在子項目下產生一個migrations文件夾,里面是根據我們定義的類來生成的表結構的py文件,
  3. 第三步同步表到數據庫,命令: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

建表時如果表結構是帶有上傳圖片的,有三步需要額外操作的

  1. 使用ImageField需要安裝pip install pillow才可以使用,否則會報錯
  2. upload_to指定圖片放置的目錄
  3. 在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種方法:

  1. 數據庫表里直接添加數據
  2. django自帶一個后台管理頁面工具,可在這里對自己創建的表進行增刪改查

要想使用django自帶的后台管理工具操作數據庫,需做如下配置:

  1. 在urls.py里有一個配置的path是admin,只要訪問url后面加admin即可打開后台管理工具頁面
  2. 創建后台管理工具的超級用戶  python manage.py createsuperuser
  3. 在子項目的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)

 

如何將創建的數據展示到頁面中

  1. 邏輯要寫在views.py
  2. 首先查數據需在views.py里導入models,查的數據是哪個表的就導入哪個表
  3. 如何在數據庫中查數據,使用類名.objects.all()就表示查所有的數據
  4. 數據要展示到頁面的哪一塊?在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> 

如何操作數據庫的增刪改查

  1. 首先import django,os
  2. 指定django的配置文件在哪里,配置自己項目名下的settings
  3. django.setup()
  4. 導入models下要操作的數據庫表
  5. 此時就可以操作數據庫啦
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) )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM