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

启动服务后的效果

 

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