1. 五大視圖
動作 | 視圖名 | 是否需要model(官方) | 是否需要form | 單/多對象 |
增 | CreateView | 是 | 是 | 單對象 |
刪 | DeleteView | 是 | 否 | 單對象 |
改 | UpdateView | 是 | 是 | 單對象 |
查 | ListView, DetailView | 是 | 否 | 多對象 |
ListView是繼承TemplateView
2. 開始一個小項目
項目介紹:新館疫情登記
項目要求:列表,列出所有人員大概信息
新建app:django-admin startapp personal_info
創建文件夾文件 first_project/personal_info/templates/personal_info/person_list.html
提示:如果html記不清的話,去這個boostrap看一下,他是一個比較簡單的前端庫,主要是css和js的組件
代碼如下
# first_project/personal_info/views.py from django.shortcuts import render # Create your views here. from django.views.generic import ListView from personal_info.models import Person class PersonList(ListView): model = Person template_name = 'personal_info/person_list.html'
# first_project/personal_info/urls.py from django.urls import path from personal_info import views app_name = 'personal_info' urlpatterns = [ path('', views.PersonList.as_view()), ]
# first_project/peronal_info/models.py from django.db import models class Person(models.Model): # 繼承Model GENDER_CHOICES = ( (1, '男'), (0, '女') ) name = models.CharField(max_length=32) # 定義VARCHAR類型字段,max_length是必須的 age = models.IntegerField() # 定義整形字段 gender = models.BooleanField(choices=GENDER_CHOICES) # 定義布爾類型變量,可選擇的 id_card = models.CharField(max_length=18) address = models.CharField(max_length=256) temperature = models.FloatField() # 定義浮點型字段 class Meta: # model中的配置中心 permissions = () # 將數據庫權限設置爲空
<!-- first_project/personal_info/templates/personal_info/person_list.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>疫情人員登記表</title> </head> <body> <table class="table"> <thead> <tr> <th scope="col">ID</th> <th scope="col">名字</th> <th scope="col">年齡</th> <th scope="col">性別</th> <th scope="col">疑似</th> </tr> </thead> <tbody> <!-- 默認是object_list 模板語言for循環語法 --> {% for item in object_list %} <tr> <td>{{ item.id }}</td> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <!-- 不加get_display會顯示數字 --> <td>{{ item.gender.get_display }}</td> <td>{% if item.temperature > 37 %}是{% else %}否{% endif %}</td> </tr> {% empty %} <tr> <!-- 意思是將5列合併成1列 --> <td colspan="5">暫無數據</td> </tr> {% endfor %} </tbody> </table> </body> </html>
# first_project/first_project/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'first_app.apps.FirstAppConfig', # 註冊 fist_app 'personal_info.apps.PersonalInfoConfig', # 註冊 personal_info ]
# first_project/first_project/urls.py from django.contrib import admin from django.urls import path, include from first_app import urls as first_app_urls from personal_info import urls as personal_info_urls urlpatterns = [ path('admin/', admin.site.urls), path('first_app/', include(first_app_urls, namespace='test')), path('personal_info/', include(personal_info_urls, namespace='personal_info')) ]
執行 python3 manage.py makemigrations,會遍歷每個目錄下models.py文件,如果有定義model,會生成相應的遷移文件
一般不需要關注生成的文件
執行 python3 manage.py migrate 遷移文件
啓動服務
因爲數據庫中沒有數據,所以是合理的
3.模板
新建目錄和文件夾 first_project/personal_info/templatetags/mytags.py
# first_project/personal_info/templatetags/mytags.py from functools import reduce from django import template register = template.Library() # register的名字是固定的,不可改變 @register.filter(is_safe=False) def add_filter(value, rounded=2): assert isinstance(value, list) return round(sum(value), rounded) @register.simple_tag # 官方推薦方式 def add_tag(*args, **kwargs): args = args[0] assert isinstance(args, list) result = reduce(lambda x,y: x+y, args) rounded = kwargs.get('rounded') or 2 result = round(result, rounded) return result
# first_project/personal_info/views.py from django.shortcuts import render # Create your views here. from django.views.generic import ListView from personal_info.models import Person class PersonList(ListView): model = Person template_name = 'personal_info/person_list.html' def get_context_data(self, *, object_list=None, **kwargs): context = super().get_context_data(object_list=object_list, **kwargs) # 先把父類的context拿到 context.update({'list': [1.23, 2.34, 3.45]}) return context
{% load mytags %} <!-- 導入自定義tag --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>疫情人員登記表</title> </head> <body> <table class="table"> <thead> <tr> <th scope="col">ID</th> <th scope="col">名字</th> <th scope="col">年齡</th> <th scope="col">性別</th> <th scope="col">疑似</th> </tr> </thead> <tbody> {{ list|add_filter }} <!-- 調用自定義filter --> {% add_tag list %} <!-- 調用自定義tag --> <!-- 默認是object_list 模板語言for循環語法 --> {% for item in object_list %} <tr> <td>{{ item.id }}</td> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <!-- 不加get_display會顯示數字 --> <td>{{ item.gender.get_display }}</td> <td>{% if item.temperature > 37 %}是{% else %}否{% endif %}</td> </tr> {% empty %} <tr> <!-- 意思是將5列合併成1列 --> <td colspan="5">暫無數據</td> </tr> {% endfor %} </tbody> </table> </body> </html>
啓動服務後的效果