python3之Django基礎篇

1、Django基礎

Django 是用Python開發的一個免費開源的Web框架,能夠用於快速搭建高性能,優雅的網站!html

Django的特色:python

強大的數據庫功能:擁有強大的數據庫操做接口(QuerySet API),也能執行原生SQLlinux

自帶強大後臺:網站擁有一個強大的後臺,輕鬆管理內容redis

優雅的網址:用正則匹配網址,傳遞到對應函數,隨意定義。sql

模版系統:易擴展的模版系統,設計簡易,代碼,樣式 分開設計,更容易管理。shell

緩存系統:與memcached,redis等緩存系統聯用,更出色的表現,更快的加載速度。數據庫

國際化:徹底支持多國語言應用,容許定義翻譯的字符,輕鬆翻譯成不一樣國際的語言。django

Django目錄結構:json

urls.py:網址入口,關聯到對應的Views.py中的一個函數,訪問網址對應的函數。bootstrap

views.py:處理用戶發出的請求,從urls.py中對應過來,經過渲染templates中的網頁能夠將顯示內容,好比登錄後的用戶名,數據,輸出到網頁。

models.py:與數據庫操做相關,存入或讀取數據時用到這個

templates文件夾:views.py中的函數渲染templates中的HTML模版,獲得動態內容網頁,能夠用緩存來提升速度。
admin.py:後臺,能夠用不多量的代碼就擁有一個強大的後臺。

settings.py:Django的全局設置,配置文件,好比DEBUG的開關,靜態文件的位置設置等。

2、Django安裝

一、用pip來安裝

(1)安裝pip:yum install python-pip   或者https://bootstrap.pypa.io/get-pip.py 下載get-pip而後運行python get-pip.py就能夠安裝pip了;也能夠下載pip源碼包,運行python setup.py install 進行安裝。

(2)利用pip安裝Django

pip install Django 或者  pip install Django==2.0.4

升級pip能夠用:pip install --upgrade pip

二、下載源碼安裝

linux and MAC:

下載源碼包:https://www.djangoproject.com/m/releases/2.0/Django-2.0.4.tar.gz

tar -xvf django-2.0.4.tar.gz
cd django-2.0.4
python setup.py install

三、linux用自帶源進行安裝

ubuntu:
sudo apt-get install python-django -y
fedora:
yum install python-django -y

檢查是否安裝成功:看到版本號則安裝成功!

In [1]: import django

In [2]: django.VERSION
Out[2]: (2, 0, 4, 'final', 0)

In [3]: django.get_version()
Out[3]: '2.0.4'

3、Django基本命令

一、新建一個django project項目

(zhang) [root@python zhang]# django-admin startproject pyqi
(zhang) [root@python zhang]# tree pyqi/
pyqi/
├── manage.py
└── pyqi
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

pyqi/根目錄只是項目的容器,它的名字與Django無關,能夠將它重命名爲任何任何名字

manage.py:一個命令行實用程序,可以讓你以各類方式與Django項目進行交互

pyqi:是項目的實際python包,它的名字是你須要用來導入任何內容的python包名

__init__.py:一個空文件,告訴python這個目錄應該被視爲一個python包

settings.py:這是Django項目的設置與配置,Django設置會告訴你有關設置如何工做的全部信息

urls.py:這是Django項目的URL聲明

wsqi.py:WSGI兼容的Web服務器爲你的項目提供服務的入口點

二、新建app

cd project_name  #切換到項目目錄下
python manage.py startapp app_name
或者
django-admin.py startapp app-name

三、建立數據庫表或更改數據庫表或字段

在APP的models中創建類數據模版
class userinfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    salary = models.IntegerField()
生成配置文件:
(zhang) [root@python pyqi]# python manage.py makemigrations
Migrations for 'app01':
  app01/migrations/0001_initial.py
    - Create model userinfo
根據配置文件粗昂居數據庫相關表:
(zhang) [root@python pyqi]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying app01.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

這種方法能夠在SQL等數據庫中建立與models代碼相對應的表。

四、開發服務器使用

python manage.py runserver 0.0.0.0:8000

五、清空數據庫

python manage.py flush
此命令會把數據所有清空掉,只留下空表

六、建立超級管理員

python manage.py createsuperuser
根據提示輸入用戶名、郵箱和密碼,郵箱能夠爲空

python manage.py changepassword username
修改用戶密碼

七、導出數據和導入數據

導出數據:
python manage.py dumpdata appname > appname.json
導入數據:
python manage.py loaddata appname.json

八、更多命令

項目環境終端:
python manage.py shell
數據庫命令行:
python manage.py dbshell
查看命令:
python manage.py

4、項目視圖、網址、URL、模塊、模型

一、新建一個項目

(zhang) [root@python zhang]# django-admin startproject mysite

咱們會發現執行命令後,新建了一個 mysite 目錄,其中還有一個 mysite 目錄,這個子目錄 mysite 中是一些項目的設置 settings.py 文件,總的urls配置文件 urls.py 以及部署服務器時用到的 wsgi.py 文件, __init__.py 是python包的目錄結構必須的,與調用有關。

二、新建一個應用(app),名稱叫leran

(zhang) [root@python mysite]# python manage.py startapp learn
(zhang) [root@python mysite]# tree learn/
learn/
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

1 directory, 7 files

把咱們新定義的app加到settings.py中的INSTALL_APPS中

修改 mysite/mysite/settings.py

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
 
    'learn',
)

 新建的 app 若是不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板文件(app-name/templates/下的文件)和靜態文件(app-name/static/中的文件)

三、定義視圖函數(訪問頁面時的內容)

咱們在learn這個目錄中,把views.py打開,修改其中的源代碼,改爲下面的:

from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.

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

引入HttpResponse,它是用來向網頁返回內容的,就像python中的print同樣,只不過HttpResponse是把內容顯示在網頁上。

定義一個index()函數,第一個參數必須是request,與網頁發來的請求有關,request變量裏面包含get或post內容,用戶瀏覽,系統信息在裏面。函數返回一個HttpResponse對象,能夠通過一些處理,最終顯示在網頁上。

render將返回模版

四、定義視圖函數相關的URL(地址)即規定訪問什麼網址對應什麼內容。

打開 mysite/mysite/urls.py 這個文件, 修改其中的代碼:

Django 1.8.x-Django 2.0版本須要先引入再使用:

from django.conf.urls import url
from django.contrib import admin
from learn import views as learn_views  # new
 
 
urlpatterns = [
    url(r'^$', learn_views.index),  # new
    url(r'^admin/', admin.site.urls),
]

Django 2.0 版本,urls.py 有比較大的變化(上面 Django 1.8 的在 2.0 中也能夠用,是兼容的)

from django.contrib import admin
from django.urls import path
from learn import views as learn_views  # new
 
 
urlpatterns = [
    path('', learn_views.index),  # new
    path('admin/', admin.site.urls),
]

該path()傳遞四個參數,其中兩個是必需的:route和view,以及兩個可選的:kwargs和name。

route是一個包含UR模式的字符串,在處理請求時,Django從第一個模式開始url patterns並在列表中向下,將所請求的URL與每一個模式進行比較,直到找到匹配的模式。

模式不搜索get和post參數或域名,URLconf將查找myapp/

view:當Django找到一個匹配的模式時,它會以一個HttpRequest對象做爲第一個參數以及路由中的任何捕獲值做爲關鍵字參數來調用指定的視圖函數。

kwargs:任意關鍵字參數能夠在字典中傳遞給目標視圖。

name:命名你的URL可讓你從Django其餘地方明確的引用它,特別是在模版中,這個強大的功能容許你在只觸摸單個文件的狀況下對項目的URL模式進行全局更改。

 

在終端上運行python manage.py runserver運行開發服務器。

python manage.py runserver 0.0.0.0:8000  #表示監聽全部地址在8000端口
Performing system checks...

System check identified no issues (0 silenced).

You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

April 26, 2018 - 05:38:33
Django version 2.0.4, using settings 'mysite.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

訪問網址:http://192.168.146.129:8000/    顯示OK就成功了!

五、在網頁上使用get方法傳參

新建應用app:
(zhang) [root@python mysite]# python manage.py startapp calc

修改calc/views.py文件:
from django.shortcuts import render
from django.http import HttpResponse

 # Create your views here.

def add(request):
     a = request.GET['a']
     b = request.GET['b']
     c = int(a)+int(b)
     return HttpResponse(str(c))  

接着修改 mystie/urls.py 文件,添加一個網址來對應咱們剛纔新建的視圖函數
from django.contrib import admin
from django.urls import path
from learn import views as learn_views
from calc import views as valc_views   #增長的行

urlpatterns = [                                     
     path('admin/', admin.site.urls),
     path('',learn_views.index),
     path('add',calc_views.add,name='add'),  #改動的行
]

訪問網址並傳值a=8&b=6,頁面顯示14則表示配置正確:

http://192.168.146.129:8000/add?a=8&b=6

六、採用/add/3/4方式傳參

修改calc/views.py文件,定義新函數add2:

def add2(request,a,b):
      c = int(a) + int(b)
      return HttpResponse(str(c)) 

修改urls.py添加URL路由:

path('add/<int:a>/<int:b>/',calc_views.add2,name='add2'),

Django 1.8也能夠這樣寫:

url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

訪問:http://192.168.146.129:8000/add/1024/768/     頁面顯示結果!!!

七、URL詳解

url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),這裏的name=add2'是用來幹什麼的呢?
簡單說,name能夠用於在templates,models,views中獲得對應的網址,至關於‘給網址取了個名字’,只要這個名字不變
網址變了也能經過名字獲取到。

修改calc/views.py 使用render的時候,Django 會自動找到 INSTALLED_APPS 中列出的各個 app 下的 templates 中的文件
def index(request):
    return render(request,'home.html')
在calc 這個 app 中新建一個 templates 文件夾,在templates中新建一個 home.html
文件 calc/templates/home.html 中寫入如下內容(保存時用 utf8 編碼)
<!DOCTYPE html>
<html>
<head>
    <title>Django 2.0</title>
</head>
<body>
 
<a href="/add/4/5/">計算 4+5</a>
 
</body>
</html>

修改urls.py

  path('',calc_views.index,name='home'),

這樣寫,就把網址寫死了,如需修改,代價會很大。

咱們能夠用python代碼獲取對應的網址(能夠用在views.py,models.py等各類須要轉換獲得網址的地方)

 

# python manage.py shell
In [1]: from django.urls import reverse
In [4]: reverse('add2', args=(3,4))
Out[4]: '/add/3/4/'
In [5]: reverse('add2', args=(111,789))
Out[5]: '/add/111/789/

 

reverse 接收 url 中的 name 做爲第一個參數,咱們在代碼中就能夠經過 reverse() 來獲取對應的網址(這個網址能夠用來跳轉,也能夠用來計算相關頁面的地址),只要對應的 url 的name不改,就不用改代碼中的網址。

在網頁模板中也是同樣,能夠很方便的使用

不帶參數的:
{% url 'name' %}
帶參數的:參數能夠是變量名
{% url 'name' 參數 %}
 
例如:
<a href="{% url 'add2' 4 5 %}">link</a>


上面的代碼渲染成最終的頁面是:
<a href="/add/4/5/">link</a>
這樣就能夠經過 {% url 'add2' 4 5 %} 獲取到對應的網址 /add/4/5

當對urls進行更改後,前提是不改name,獲取的網址也會動態的跟着變。

如URL更改後,須要寫個跳轉到原來的url上:

def old_to_new(request,a,b):
     return HttpResponseRedirect(
         reverse('add2',args=(a,b))                                       
)

八、django模版(templates)

使用模塊:在views中使用render渲染網頁文件:

from django.shortcuts import render

# Create your views here.

def index_home(request):
    return render(request,'t2.html')

在templates目錄下建模版文件‘t2.html’,便可實現模版訪問!!!

網站模版的設計,通常網站有一些通用的部分,好比:導航,底部,訪問統計代碼等等。

能夠設置分頁模版:top.html, bottom.html,

<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}不繼承標題{% endblock %}</title>
</head>
<body>
 
{% include 'nav.html' %}   #繼承nav.html內容
 
{% block content %}   #不繼承內容
<div>這裏是默認內容,全部繼承自這個模板的,若是不覆蓋就顯示這裏的默認內容。</div>
{% endblock %}
 
{% include 'bottom.html' %}  #繼承bottom.html內容

</body>
</html>

若是須要,寫足夠多的 block 以便繼承的模板能夠重寫該部分,include 是包含其它文件的內容,就是把一些網頁共用的部分拿出來,重複利用,改動的時候也方便一些,還能夠把廣告代碼放在一個單獨的html中,改動也方便一些,在用到的地方include進去。

還可使用extends來擴展示在網頁的內容:

{% extends 'base.html' %}   #擴展內容
{% block title %}huanyinguanlin{% endblock %}
{% block content %}
{% include 't3.html' %}  #包含內容
{% endblock %}

實例1:基本字符串網頁顯示

views.py

def test(request):
    string = "zixuejianzhan"
    return render(request,'test.html',{'string':string})

home.html

<body>
{{ string }}
</body>

實例2:list列表在網頁中顯示

views.py

def list1(request):
    TutorialList = [1, 5555, "jQuery", "Python", "Django"]
    return render(request, 'list.html', {'List': TutorialList})

home.html

<body>
教程列表:
{% for i in List %}
{{ i }}
{% endfor %}
</body>

實例3:字典在網頁中顯示

views.py

def dict(request):
    info_dict = {'one':'zixue','two':'IT'}
    return render(request,'dict.html',{'info_dict':info_dict})

home.html

<body>
{{ info_dict.one }}:{{ info_dict.two }}  #取字典值
{% for key,value in info_dict.items %}  #循環取鍵值對
    {{ key }}: {{ value }}
{% endfor %}
</body>

實例4:for循環和添加判斷

forloop.last判斷是否爲最後一個元素,不是加‘,’,是則不加

views.py

def forif(request):
    list = map(str,range(100))
    return render(request,'forif.html',{'list':list})

home.html

<body>
{% for item in list %}
    {{ item }}{% if not forloop.last %},{% endif %}
{% endfor %}
</body>

在for循環中還有不少有用的東西,以下:

forloop.counter    索引從1開始算

forloop.counter0    索引從0開始算

forloop.revcounter    索引從最大長度到1

forloop.revcounter0    索引從最大長度到0

forloop.first      當遍歷的元素爲第一項時爲真

forloop.last      當遍歷的元素爲最後一項時爲真

forloop.parentloop    用來嵌套的for循環中,獲取上一層for循環的forloop

當列表中可能爲空值時用 for  empty:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>抱歉,列表爲空</li>
{% endfor %}
</ul>

 實例5:模塊上獲得視圖對應的網址

#views.py
from django.shortcuts import HttpResponse

def add(request,a,b):
    c = int(a) + int(b)
    return HttpResponse(str(c))

#urls.py
from app01 import views as app01_views
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('adds/(\d+)/(\d+)/',app01_views.add,name='add')
]

#template.html
<body>
{% url 'add' 4 5 %}
</body>

這樣在修改路由後,name會記錄網址,在不修改模板的狀況下,依然能正常訪問網址!

實例6:模板中的邏輯操做(==,!=,>=,<=,>,<)

views.py
def home(request,a):
    return render(request,'home.html',{'a':int(a)})

urls.py
re_path('home/(\d+)/',app01_views.home)

home.html
<body>
{{ a }} <br />
{% if a >= 90 %}
    成績優秀!
    {% elif a >= 80 %}
    成績良好
    {% elif a >= 70 %}
    成績通常
    {% elif a >= 60 %}
    須要努力
    {% else %}
    不及格,大哥,須要努力了!
{% endif %}
</body>

注意:比較符號先後必須有至少一個空格!

and,or,not,in,not in也能夠在模板中使用

獲取當前用戶:{{request.user}}

獲取當前網址:{{request.path}}

獲取當前GET參數:{{request.GET.urlencode}}

完整的內容參考官方文檔:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/

5、Django模型(數據庫)

Django 模型是與數據庫相關的,與數據庫相關的代碼通常寫在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等數據庫,只須要在settings.py中配置便可,不用更改models.py中的代碼,豐富的API極大的方便了使用。

一、在項目應用中的models.py文件中新建類,用來建立數據表

from django.db import models

# Create your models here.

class person(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()

二、進入項目下使用命令行模式同步數據庫(默認使用SQLite3,無需配置)

C:\Users\Administrator\PycharmProjects\untitled\test_django>python manage.py makemigrations
Migrations for 'app01':
  app01\migrations\0001_initial.py
    - Create model person

C:\Users\Administrator\PycharmProjects\untitled\test_django>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying app01.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

咱們會看到,Django生成了一系列的表,也生成了咱們新建的app01_person這個表

在項目應用中views.py上引導models,建立數據庫鏈接函數:

from app01 import models
#數據庫鏈接操做
#建立請求函數經過model下的類連接數據庫增長修改數據:
def homes(request):
#增長數據
方法1:             
    models.userinfo.objects.create(name='zhang',age=9)
方法2:
    lis={'name':'lisi','password':'1111','age':28}
    models.userinfo.objects.create(**lis)
#刪除數據
    models.userinfo.objects.filter(name='san').delete()
#修改數據
    models.userinfo.objects.filter(name='zhang').update(age=23)
    models.userinfo.objects.all().update(Salary=56789) #修改全部的數據
#查找數據
    #models.userinfo.objects.all()
    #models.userinfo.objects.all()[:10] 切片操做,獲取10個數據,不支持負索引
    #models.userinfo.objects.filter(name='zhang')
    #models.userinfo.objects.filter(name='zhang').first() 獲取第一個 

參考文檔:

更多相關內容:http://code.ziqiangxuetang.com/django/django-queryset-api.html

Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/

Fields相關官方文檔:https://docs.djangoproject.com/en/dev/ref/models/fields/

Django數據庫操做官方文檔: QuerySet API: https://docs.djangoproject.com/en/dev/ref/models/querysets/

相關文章
相關標籤/搜索