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 后台管理中,您还可以导入和导出数据。以下是实现导入和导出的步骤:
- 📑安装 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 的模板系统将 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 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
在这个示例中,{{ 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 映射规则:
- 第一个 URL 映射规则将浏览器中输入的 URL 路径
/admin/
映射到 Django 管理后台。 - 第二个 URL 映射规则将浏览器中输入的 URL 路径
/hello/
映射到views.hello
视图函数。 - 其中,第二个 URL 映射规则,通过
path()
函数指定了一个 URL 路径/hello/
,并将它映射到名为
views.hello
的视图函数。 - 这意味着,当该 Django 应用程序接收到浏览器中的
/hello/
请求时,Django 将自动调用
views.hello(request)
来响应该请求,其中request
参数将包含来自浏览器的 HTTP 请求对象。 - 在
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 视图函数的实现流程。
- 首先在 templates 文件夹中新建了xxx.html 文件,使用它作为模板文件;
- 为模板文件配置对应的视图,为模板进行传参。
- 然后我们配置了视图函数的路由映射关系,来访问视图;
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
: 用于加载模板使用的模板引擎的名称。