html获取获取model中的数据,【CRM客户关系管理】08.取出
app中model的值。。。
根据注册models配置⽣成数据列表
取出app中model的值
models详情视图table_detail
在djadmin应⽤的views.py新建视图
@login_required
def table_detail(request, app_name, model_name):
"""取出指定model⾥的数据返回到前端"""
# 拿到admin_class后,通过它获取model
admin_class = able_admins[app_name][model_name]
queryset = del.objects.all()
print(queryset)
return render(request, 'djadmin/table_detail.html', locals())
创建详情的模板table_detail.html
{% extends 'djadmin/base.html' %}
{% block title %}
数据表详情 - 后台管理
{% endblock %}
{% block content %}
应⽤ - {{ app_name }}
{{ queryset }}
{{ app_name }}
{% endblock %}
models详情url
修改djadmin应⽤下的urls,增加详情路由
from django.urls import path
from djadmin.views import index, user_login, user_logout, table_detail
app_name = 'djadmin'
urlpatterns = [
path('login/', user_login, name='user_login'), # djAdmin登录
path('logout/', user_logout, name='user_logout'), # djAdmin登出
path('', index, name='index'), # djAdmin主页
django admin 自定义页面
path('//', table_detail, name='table_detail'), # 数据表详情
]
修改index.html增加详情链接
访问这四个页⾯的详情链接
image.png
]>
[10/Nov/2018 10:49:23] "GET /djadmin/crm/customerinfo/ HTTP/1.1" 200 4592
]>
[10/Nov/2018 10:49:26] "GET /djadmin/crm/role/ HTTP/1.1" 200 4587
]>
[10/Nov/2018 10:49:28] "GET /djadmin/crm/menu/ HTTP/1.1" 200 4587
]>
[10/Nov/2018 10:49:31] "GET /djadmin/crm/userprofile/ HTTP/1.1" 200 4587
判断注册类实例化
最终打印出来的queryset = del.objects.all()有三个是相同的,也就是没注册三个model⾥⾯得到值是⼀样
原因分析:因为没注册的三个mdoel都共享同⼀个BaseDjAdmin内存对象(三个model内存地址⼀样),我们只需要实例化就可以了(实例化后就都有单独的内存空间了)
修改djadmin/sites.py⽂件,增加判断实例化对象
from djadmin.djadmin_base import BaseDjAdmin
class AdminSite(object):
def __init__(self):
# 两个参数,⼀个表名,⼀个⾃定义的admin类
def register(self, model_class, admin_class=None):
"""注册admin表"""
# print('register',model_class,admin_class)
# 获取app名字
app_name = model_class._meta.app_label
# 获取表名
model_name = model_class._del_name
# 获取表别名
# model_verbose_name = model_class._meta.verbose_name
# print(model_verbose_name)
if admin_class:
# 如果写了注册的类,就实例化⾃⼰
admin_class = admin_class()
else:
# 如果没有写注册的类,就⽤BaseDjAdmin实例化,防⽌使⽤相同的内存地址
admin_class = BaseDjAdmin()
# 把model_class赋值给了admin_class,然后在视图中可以通过admin_class到对应的model类(表名字)
del = model_class
if app_name not able_admins:
# 实例化,就可以调⽤register⽅法
site = AdminSite()
然后访问各个链接,都是返回各⾃的查询集了
[10/Nov/2018 11:11:22] "GET /djadmin/ HTTP/1.1" 200 5415
]>
[10/Nov/2018 11:11:24] "GET /djadmin/crm/customerinfo/ HTTP/1.1" 200 4592
, ]>
[10/Nov/2018 11:11:27] "GET /djadmin/crm/role/ HTTP/1.1" 200 4605
, , ]>
[10/Nov/2018 11:11:31] "GET /djadmin/crm/menu/ HTTP/1.1" 200 4655
]
>
[10/Nov/2018 11:11:35] "GET /djadmin/crm/userprofile/ HTTP/1.1" 200 4587
根据list_display配置⽣成数据列表
通过⾃定义的admin_class类,循环出list_display所有的列
在crm应⽤下djadmin.py配置中list_display = ['name', 'contact_type', 'contact', 'consultant', 'consult_content', 'status', 'created_time']
显⽰表头
修改table_detail.html遍历出上⽅的列表
{% extends 'djadmin/base.html' %}
{% block title %}
数据表详情 - 后台管理
{% endblock %}
{% block content %}
应⽤ - {{ app_name }}
{{ queryset }}
{% for display_field in admin_class.list_display %}
{{ display_field }}
{% endfor %}
{% endblock %}
image.png
下⾯通过⾃定义模板标签显⽰表头的别名,也就是模型中定义的verbose_name
⾃定义模板标签
djadmin应⽤下新建python Package,取名为templatetags,然后再这个包内创建djadmin_tags.py⽂件plate import Library
from django.utils.safestring import mark_safe
register = Library()
# 显⽰模型表的中⽂名称
@register.simple_tag
def build_table_head_name(admin_class):
th = ''
for display_field in admin_class.list_display:
# 获取列中的字段对象
display_field_obj = del.__field(display_field)
# print(display_field_obj.verbose_name)
tmp = "
{}".format(display_field_obj.verbose_name)
th += tmp
return mark_safe(th)
# 显⽰表数据
@register.simple_tag
def build_table_body(obj, admin_class):
"""
⽣成⼀条记录的html元素
:param obj: ⼀个模型查询集中的⼀个对象
:param admin_class: ⾃定义注册的类
:
return: 得到这个对象要求显⽰的所有列
"""
td = ''
for display_field_name in admin_class.list_display:
# 根据属性名,获取对象的属性值,两个参数,⼀个对象obj,⼀个列名
display_field_data = getattr(obj, display_field) # 获取⼀个对象的属性值,例如对象,得到他的name属性,值为⼩东tmp = "
{}".format(display_field_data)
td += tmp
return mark_safe(td)
数据列表中使⽤模板标签
⾸先导⼊{% load djadmin_tags %}
遍历查询集,得到每⼀个对象
将对象和⾃定义的注册类两个参数传⼊到模板标签
{% extends 'djadmin/base.html' %}
{% load djadmin_tags %}
{% block title %}
数据表详情 - 后台管理
{% endblock %}
{% block content %}
应⽤ - {{ app_name }}
{{ queryset }}
{% build_table_head_name admin_class %}
{% for obj in queryset %}
{% build_table_body obj admin_class %}
{% endfor %}
{% endblock %}
image.png
但是其中的选择项的列是数字,⽐如status显⽰的1,2,想要显⽰未报名,已报名等
修改模板标签选择项显⽰⽅式
因为有的字段有choices,有的字段没有choices,需要添加⼀个判断
models.CustomerInfo._meta.fields 获取model所有字段的对象
models.CustomerInfo.__field('status') 取⼀个字段的对象
get_xxxx_display 显⽰choices⾥⾯的值
继续修改模板标签build_table_body(obj, admin_class)函数
# 显⽰表数据

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。