Django基础入门④:数据表显示和Django模板详讲

Django基础入门④:数据表显示和Django模板详讲

  • 数据表显示
    • 字段显示
    • 表单显示分块
    • 内联显示
    • 列表显示
    • 搜索栏目创建
    • 筛选
    • 排序
    • 分页
    • 导入导出
  • Django模板
    • 什么是模板
    • 模板使用
    • render方法详解

️️个人简介:以山河作礼。
️️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。


数据表显示

字段显示

在数据库字段中,有一些数据是不需要显示给后台的,可以将字段进行指定的显示,来整洁页面。

from django.contrib import admin  # Django自动在admin.py文件中导入

from index.models import Book, Author, UserInfo  # 这个需要我们自己导入相应的模型类(数据表)


class AuthorAdmin(admin.ModelAdmin):
    fields = ('author_id',) # 需要显示的字段


admin.site.register(Author, AuthorAdmin)

admin.site.register([Book, UserInfo])

作用:设置表单中需要显示的数据

表单显示分块

我们还可以将输入栏分块,每个栏也可以定义自己的格式

fieldsets = (
        ['Main', {
            'fields': ('author_id', ),
        }],
        ['Advance', {
            'classes': ('collapse',),  # CSS
            'fields': ('email',),
        }]
    )

上面的栏目分为了 Main Advance 两部分。classes 说明它所在的部分的 CSS 格式(这里学会这个即可)。

这里让 Advance 部分隐藏: ‘class’: (‘collapse’,) 表示将该字段设置为折叠状态,以便在用户需要时选择展开

内联显示

内联基础是需要两个表有外部键,所以有外部参考的关系

而在默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。我们可以使用内联显示,让 一个页面 附加在另外一个页面 的编辑页面上显示。

from django.contrib import admin
from import_export.admin import ImportExportModelAdmin

from book.models import Author, Book


class TagInline(admin.TabularInline):
    model = Book
    extra = 1  # extra 参数指定了默认行的数量


@admin.register(Author)  # 新的注册写法
class AuthorAdmin(ImportExportModelAdmin, admin.ModelAdmin):
    # fields = ('name', 'email', 'gender')  # 需要显示的字段
    list_display = ('name', 'email')
    search_fields = ('name', 'email')
    list_filter = ('age',)
    ordering = ['email', ]
    inlines = [TagInline]
    list_per_page = 50  # 添加每页记录数。
    fieldsets = (['Main', {
        'fields': ('name', 'email'), }],
                 ['Advance', {
                     # 'classes': ('collapse',),
                     'fields': ('age', 'gender'), }]
                 )


admin.site.register([Book])  # 注册表

列表显示

我们也可以自定义该页面的显示,比如在列表中显示更多的栏目.用于增加和显示更多的列

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('author_id', 'email')

搜索栏目创建

作用是增加搜索组件,并且搜索指定的字段数据

class AuthorAdmin(admin.ModelAdmin):
	search_fields = ('name',)

筛选

对数据列进行筛选,获取筛选后的数据。筛选指定的列

class AuthorAdmin(admin.ModelAdmin):
    list_filter = ('author_id',)

排序

对列数据进行排序

class AuthorAdmin(admin.ModelAdmin):
    ordering = ['email', ]  # 添加一个排序选项

分页

当你有成千上万条记录时,您可以通过分页来显示少量的记录。以下是实现分页的步骤:

class AuthorAdmin(admin.ModelAdmin):
    list_per_page = 50  # 添加每页记录数。

导入导出

在 Django Admin 后台管理中,您还可以导入和导出数据。以下是实现导入和导出的步骤:

  1. 安装 django-import-export 模块
pip install django-import-export

2 确定已经安装并在 INSTALLED_APPS 中注册了 import_export 应用程序

from import_export.admin import ImportExportModelAdmin # 一定要导入导入导出模块

class BookAdmin(ImportExportModelAdmin, admin.ModelAdmin):

Django模板

Django基础入门④:数据表显示和Django模板详讲_第1张图片

Django 的模板系统将 Python 代码与 HTML 代码解耦,动态地生成 HTML 页面。Django 项目可以配置一个或多个模板引擎,但是通常使用 Django 的模板系统时,应该首先考虑其内置的后端 DTL(DTL 是一种用来创建模板变量和标签的语言,它允许你在模板中引用 Python 变量和函数,并在 Web 应用程序中生成动态内容) 模板语言。

什么是模板

在 Django 中,模板是可以根据字典数据动态变化的,并且能够根据视图中传递的字典数据动态生成相应的 HTML 网页。Django 中使用 Template 来表示模板,Template 对象定义在 template 文件中

  • 模板的配置

首先按照BookStore/templates路径创建模板文件夹 templates,在 settings.py 配置文件中有一个 TEMPLATES 变量,如下所示:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  #指定模板文件的存放路径
        'APP_DIRS': True, #搜索APP里面的所有templates目录
        'OPTIONS': {
            'context_processors': [  #context_processors 用于配置模板上下文处理器
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

其中每一项含义如下所示:

  • BACKEND : Django默认设置,指定了要是用的模板引擎的 Python 路径;

  • DIRS : 一个目录列表,指定模板文件的存放路径,可以是一个或者多个。模板引擎将按照列表中定义的顺序查找模板文件;

  • APP_DIRS : 一个布尔值,默认为 Ture。表示会在安装应用中的 templates 目录中搜索所有模板文件;

  • OPTIONS : 指定额外的选项,不同的模板引擎有着不同的可选参数例如context_processors 用于配置模板上下文处理器,在使RequestContext时将看到它们的作用。

  • 修改settings配置文件

修改 settings.py 文件,设置 TEMPLATES 的 DIRS 值来指定模板的搜索目录为“templates”如下所示:

'DIRS': [os.path.join(BASE_DIR, 'templates')]

模板使用

在你的 Django 应用程序中的 templates 目录中创建一个新的模板文件,比如说 hello.html,然后在文件中编写以下 HTML 代码:




    
    Hello


Hello, {{ name }}!

在这个示例中,{{ name }} 是由两个花括号包裹的模板变量。当 Django 渲染模板时,它会查找模板上下文中的 name变量,并将其值替换为模板中的变量。最终,模板引擎会将渲染后的 HTML 网页发送给浏览器。

视图中出来通过render方法直接加载并响应模板:

from django.shortcuts import render
return render(request,'模板文件名', 字典数据)

以下代码是一个 Django 视图函数,它渲染一个包含变量 name 的 HTML 模板,并将渲染后的结果发送给客户端的浏览器。

from django.shortcuts import render

def hello(request):
    context = {
        'name': 'Alice',
    }
    return render(request, 'hello.html', context)

我们需要在 Django 中定义视图函数来处理来自浏览器的 HTTP 请求。当然,这只是 Django 中的一部分。我们还需要配置 URL映射、编写模板等等

在 BookStore/urls.py 文件的 urlpatterns 列表中为视图函数配置路由映射关系。

配置如下:

from django.contrib import admin
from django.urls import path
from index import views  # 导入刚视图文件

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.hello),  # 当访问主路径下的hello路径时,返回视图中的hello函数
]

以上这段代码定义了 Django URL 常规写法,包括两个 URL 映射规则:

  1. 第一个 URL 映射规则将浏览器中输入的 URL 路径 /admin/ 映射到 Django 管理后台。
  2. 第二个 URL 映射规则将浏览器中输入的 URL 路径 /hello/ 映射到 views.hello 视图函数。
  3. 其中,第二个 URL 映射规则,通过 path() 函数指定了一个 URL 路径 /hello/,并将它映射到名为
    views.hello 的视图函数。
  4. 这意味着,当该 Django 应用程序接收到浏览器中的 /hello/ 请求时,Django 将自动调用
    views.hello(request) 来响应该请求,其中 request 参数将包含来自浏览器的 HTTP 请求对象。
  5. views.py 文件中,我们必须定义一个名为 hello() 的函数,以匹配 URL 映射规则。您可以在该函数中编写所需的
    Python 代码,以生成 HTTP 响应并将其发送回浏览器。

此时就完成了一个简单的示例演示了。配置完成后直接访问路径http://127.0.0.1:8000/hello/

除了上面的这种方法,也可以通过 loader 获取模板,通过 HttpResponse 进行响应

from django.http import HttpResponse
from django.template import loader
context = {
    'name': '苯环',
}
# 1.通过loader加载模板
t = loader.get_template("hello.html")
# 2.将t转换成HTML字符串
html = t.render(context)
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)

总结 从上述过程我们不难体会 Django 视图函数的实现流程。

  1. 首先在 templates 文件夹中新建了xxx.html 文件,使用它作为模板文件;
  2. 为模板文件配置对应的视图,为模板进行传参。
  3. 然后我们配置了视图函数的路由映射关系,来访问视图;

render方法详解

renbder 方法的作用是结合一个给定的模板和一个给定的字典,并返回一个渲染后的 HttpResponse
对象。通俗的讲就是把字典格式的内容,加载进 templates 目录中定义的 HTML 文件,最终通过浏览器渲染呈现。

通过点击函数可以看到render () 方法的完整参数格式如下所示:

render(request, template_name, context=None, content_type=None, status=None, using=None)

以下每个参数的含义如下所示:

  • request 是一个固定参数,用于生成响应的请求对象
  • template_name: templates 中定义的文件, 要注意路径名。比如 “templates\appname\index.html”, 参数就要写"appname\index.html"
  • context: 要传入文件中用于渲染呈现的数据, 默认是字典格式;
  • content_type: 生成的文档要使用的媒体格式类型。默认为 DEFAULT_CONTENT_TYPE 设置的值;
  • status: http 的响应代码,默认是 200;
  • using: 用于加载模板使用的模板引擎的名称。

你可能感兴趣的:(Web全栈开发,django,python,后端)