CRM项目(三)
CRM项目开发(三)
|
文章目录
|
前面我们已经将首页的雏形搞定,关于修饰部分,后面直接套用模板即可!接下来,我们需要做的是添加二级页面,也就是说,点击‘客户表’进入到独立的显示页面可以进行独立的操作。
添加二级页面
构造二级页面的路由
原生admin二级页面路由分析
先看图:

从图中,我们可以知道该url的构成条件:域名/后台名称/应用名称/表名/
仿造二级页面路由
在独立应用king_admin中的urls.py中添加,如下内容:
from django.conf.urls import url
from king_admin import views
urlpatterns = [
url(r'^$', views.index, name='table_index'),
url(r'^(\w+)/(\w+)/$', views.display_objects, name='display_objects'), #添加该数据,参数分别表示应用名和表名,name同样表示映射关系的引用
]
构造二级页面模板
在king_admin模板目录下创建table_objs.html文件,然后只需要继承一级页面即可:
{% extends 'king_admin/table_index.html' %}
{% block container %}
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
<div class="row">
</div>
{#具体的表格内容展示 #}
<table class="table table-hover">
<thead>
<tr>
<th> title_name </th>
</tr>
</thead>
<tbody>
<tr> </tr>
</tbody>
</table>
</div>
</div>
{% endblock %}
编写二级页面视图函数
内容如下:
def display_objects(request, app_name, table_name):
return render(request, 'king_admin/table_objs.html')
在首页中添加链接入口
我们还要在首页文件中添加入口标签<a></a>,具体内容如下:
table_index.html文件添加内容如下:
...
<tbody>
{% for table_name, admin in table_names.items %}
<tr>
{#1.链接:url/应用名/表名,2. 显示中文表名--使用自定义标签进行处理#}
<td><a href="{% url 'display_objects' app_name table_name %}">{% render_verbose_name admin %}</a></td>
<td>添加</td>
<td>修改</td>
</tr>
{% endfor %}
</tbody>
...
这样,我们就能够通过首页进入到二级页面了,当然现在的二级页面还什么都没有,如图:

添加二级页面显示内容
二级页面中,我们看到有很多的内容,这里先添加显示表格的相关内容。
原生admin添加显示内容分析
我们之前在原生的admin中进行注册时,添加了以下内容:
#自定义操作
class CustomerAdmin(admin.ModelAdmin):
#显示字段
list_display = ('name', 'id','qq','source','consultant','content','status','date')
#过滤
list_filter = ('source','consultant','date')
#搜索
search_fields = ('qq','name')
raw_id_fields = ('consult_course',)
#水平显示
filter_horizontal = ('tags',)
#可编辑
list_editable = ('status',)
class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user','name')
king_admin中添加显示字段
在我们自己编写的admin中添加:
#自定义类,显示特定字段
class CustomerAdmin(BaseAdmin):
#显示字段
list_display = ['qq','name','source','consultant','consult_course','date','status']
#过滤
list_filters = ['source','consultant','consult_course','status']
#model = models.Customer
class CustomerFollowUpAdmin(BaseAdmin):
list_display = ('customer','consultant','date')
过滤是后边的内容,当前可以不加。
根据字段提取数据
要显示的字段都有了,接下要根据这些字段到数据库中获取数据,并在模板渲染即可!
编写视图函数即可:
def display_objects(request, app_name, table_name):
#获取自定义的admin_class
admin_class = enabled_admins[app_name][table_name]
#数据查询
query_set = admin_class.model.objects.all()
return render(request, 'king_admin/table_objs.html',
{'admin_class': admin_class,
'query_set': query_set})
模板添加数据并渲染
在二级页面的模板中,添加如下内容:
{% extends 'king_admin/table_index.html' %}
{% load tags %}
{% block container %}
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
<div class="row">
</div>
{#具体的表格内容展示 #}
<table class="table table-hover">
<thead>
<tr>
{% for title_name in admin_class.list_display %}
<th>{{ title_name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for item in query_set %}
<tr>
{#创建列表行数据#}
{% create_row item admin_class %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
文件内容分析:
- 自定义标签
使用它原因和首页是一样的,这里不再赘述!
自定义标签文件的内容:
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
#------------------------显示表名称-->中文---------------------------
@register.simple_tag
def render_verbose_name(admin_class):
return admin_class.model._meta.verbose_name
#-------------------------创建表格行数据-----------------------------
@register.simple_tag
def create_row(query_set_obj, admin_class):
#创建标签元素--空,None不行
element = ''
#遍历要显示的models字段
for row in admin_class.list_display:
#获取显示字段对应的字段对象
field_obj = admin_class.model._meta.get_field(row)
#获取数据
#判断choice
if field_obj.choices:
#通过反射获取对象里面的值,并执行该方法get_字段_display()获取choices里面的数值
row_data = getattr(query_set_obj, 'get_{0}_display'.format(row))()
else:
row_data = getattr(query_set_obj, row)
#时间格式转换
if type(row_data).__name__ == 'datetime':
row_data = row_data.strftime('%Y-%m-%d %H-%M-%S')
#标签元素的拼接
element += "<td>{0}</td>".format(row_data)
return mark_safe(element)
页面显示效果如下:


浙公网安备 33010602011771号