Django 學習2--ListView、模版

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/views.py
# 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/personal_info/urls.py
# 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/peronal_info/models.py
<!-- 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/personal_info/templates/personal_info/person_list.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/settings.py
# 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'))
]
first_project/first_project/urls.py

 

執行 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/templatetags/mytags.py
# 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
first_project/personal_info/views.py
{% 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>
first_project/personal_info/templates/personal_info/person_list.html

啓動服務後的效果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章