1. 程式人生 > 實用技巧 >django入門

django入門

django venv

  • 安裝python
  • 安裝vscode
  • 建立虛擬環境;python -m venv .venv_hero
  • 建立並進入目錄:mkdir pro_test1
  • 啟用選擇虛擬環境:activate
  • 建立專案:pip install django==2.0,django-admin startproject test1
  • 建立app:cd test1,django-admin startapp booktest
  • 設定settings.py:加入booktest

django models

  • 定義模型類:booktest/models.py
from django.db import models

# Create your models here.
class BookInfo(models.Model):
    title=models.CharField(max_length=20)
    pub_date=models.DateField()
    ## 返回資訊能夠檢視
    def __str__(self):
        return self.title
        # return self.title.encode('utf-8')

class HeroInfo(models.Model):
    name=models.CharField(max_length=20)
    content=models.CharField(max_length=100)
    gender=models.BooleanField(default=True)
    book=models.ForeignKey(BookInfo,on_delete=models.DO_NOTHING)

    # def __str__(self):
    #     return self.name
  • 生產遷移檔案(名詞:相當於sql語句檔案):python manage.py makemigrations

  • 執行遷移檔案(建立資料庫,生成表的操作):python manage.py migrate --- 會生成db.sqlite3資料庫

  • 使用shell操作:python manage.py shell

## 查詢
python manage.py shell
from booktest.models import BookInfo
BookInfo.objects.all()
## 插入
b=BookInfo()
b.title='射鵰英雄傳'
from datetime import date
b.pub_date=date(2020,7,12)
b.save()
BookInfo.objects.all()

b=BookInfo()
b.title='神鵰俠侶'
from datetime import date
b.pub_date=date(2020,7,12)
b.save()
BookInfo.objects.all()
## 修改
b=BookInfo.objects.get(id=1)
b.title='神鵰俠侶'
b.save()
BookInfo.objects.all()

from booktest.models import HeroInfo
h=HeroInfo()
h.name='郭靖'
h.gender=True
h.content='降龍十八掌'
h.book=BookInfo.objects.get(id=1)		## 外來鍵關係
h.save()
HeroInfo.objects.all()

django admin

  • 建立超級使用者:python manage.py createsuperuser
python manage.py createsuperuser
Username (leave blank to use 'zhangfd'): admin
Email address: [email protected]
Password:admin123456
Password (again):admin123456
Superuser created successfully.
  • 進入後臺:python manage.py runserver
LANGUAGE_CODE = 'zh_Hans'     		## zh_Hans --中文
TIME_ZONE = 'Asia/Shanghai'       	## Asia/Shanghai
  • 註冊模型類:admin.py
from django.contrib import admin
from .models import *

# Register your models here.
## 定義後臺顯示資訊
class BookInfoAdmin(admin.ModelAdmin):
    list_display=['id','title','pub_data']
class HeroInfoAdmin(admin.ModelAdmin):
    list_display=['id','name','content','gender','book']

## 對模型類進行註冊後才能在後臺檢視到資訊
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)

django views + urls

  • views.py即函式
from django.shortcuts import render
from django.http import HttpResponse	## 此處只用做功能介紹,實際中用render返回

# Create your views here.
## HTTPRequest
def index(request):
    ## HttpResponse
    return HttpResponse("hello world")	## 此處只用做功能介紹,實際中用render返回
  • 設定urls
## 分析
#- def main():
#    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test1.settings')
#- test1.settings:
#    ROOT_URLCONF = 'test1.urls'
#- test1.urls:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('booktest.urls')),
]
#- booktest.urls
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
    path('index/', views.index,name="index"),
]

django templates

  • 建立目錄:project_name/templates/app_name1/
  • 模板檔案:test1/templates/booktest/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>hello world!</h1>
    <hr>
    {% for i in list %}
        <h3>{{i}}</h3>
    {% endfor %}
</body>
</html>
  • 編寫返回頁面檢視:views.py
from django.shortcuts import render
# from django.http import HttpResponse
# Create your views here.
## HTTPRequest
def index(request):
    context={'title':'django首頁','list':range(10)}     ## 多個欄位需要傳入html時,可以考慮字典
    # return HttpResponse("hello world")
    return render(request,'booktest/index.html',context)	## context為傳入HTML的引數
  • 設定模板路徑:settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')], ## templates模板路徑拼接
        ...
}
  • django 支援的模板語言
<title>{{ title }}</title>  ## 變數
{% for i in list %}		## 迴圈
   <h3>{{i}}</h3>
{% endfor %}

django models + views + templates

  • views.py
#coding=utf-8
from django.shortcuts import render
from .models import *
# from django.http import HttpResponse

# Create your views here.

## HTTPRequest
def index(request):
    #context={'title':'django首頁','list':range(10)}     ## 多個欄位需要傳入html時,可以考慮字典
    # return HttpResponse("hello world")
    list = BookInfo.objects.all()
    context = {'booklist':list}
    return render(request,'booktest/index2.html',context)

def detail(request,id):                 ##  id 用來接收url.py中匹配到的數字
    print(id)
    list = BookInfo.objects.get(id=id).HeroInfo_set()    ## 使用網頁傳過來的值,找到BookInfo中對應的一本書
    ## 反向獲取引用bookInfo的所有HeroInfo資訊
    ## HeroInfo中的book欄位設定為外來鍵,是BookInfo中title
    context = {'herolist':list}
    return render(request,'booktest/detail.html',context)
  • index2.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=, initial-scale=1.0">
    <title>圖書列表</title>
</head>
<body>
    <ul>
    {% for book in booklist %}
        <li><a href="/{{ book.id }}">{{ book.title }}</a></li>
    {% endfor %}
    </ul>
</body>
</html>
  • detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>英雄資訊</title>
</head>
<body>
    <a href="/">首頁</a>
    <hr>
    <ul>
    {% for hero in herolist %}
        <li>{{hero.name}}</li>
    {%endfor%}
</ul>
</body>
</html>
  • urls.py
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('index/', views.index),
    ## 網頁訪問:http://127.0.0.1:8000/1,http://127.0.0.1:8000/2 ..
    path('(\d+)',views.detail),   ## ()提取數字:\d+   從url頁面獲取的數字,在views中使用變數如id接收
]