当前位置:主页 > 如东 >

塞班岛_CRM客户关系管理系统(四)

kingadmin设计开发

4.4.根据list_display配置生成数据列表

(1)kingadmin/views.py

?

?(2)kingadmin/templates/kingadmin/table_obj_list.html

通过自定义的admin_class类,循环出list_display所有的列

?

{#kingadmin/templates/kingadmin/table_obj_list.html#}

{% extends "kingadmin/index.html" %}

{% block right-content-container %}
<h2 class="page-header">apph2>

<div>
        {{ querysets }}
        <table class="table table-striped">
            <thead>
                <tr>
                    {% for column in admin_class.list_display %}
                        <th>{{ column }}th>
                    {% endfor %}

                tr>
            thead>
            <tbody>

            tbody>
        table>
div>

{% endblock %}

?

?

(3)自定义模板标签

kingadmin下创建python package "templatetags",再新建kingadmin_tags.py

# kingadmin/templatetags/kingadmin_tags.py

from django.template import Library
from django.utils.safestring import mark_safe

register = Library()

@register.simple_tag
def build_table_row(obj,admin_class):
    """生成一条记录的html element"""

    ele = ""
    for column_name in admin_class.list_display:
        #通过反射获取列的数据,两个参数,一个是object,一个是列名
        column_data = getattr(obj,column_name)
        td_ele = "%s"%column_data
        ele += td_ele

    return mark_safe(ele)

?

(4)table_obj_list.html

首先要导入:{% load kingadmin_tags%}

然后使用自定义模板标签:{% build_table_row obj admin_class %}

使用的时候需要传两个参数进去

{#kingadmin/templates/kingadmin/table_obj_list.html#}

{% extends "kingadmin/index.html" %}
{% load kingadmin_tags %}

{% block right-content-container %}

class="page-header">app
{{ querysets }}
class="table table-striped"> {% for column in admin_class.list_display %} {{ column }} {% endfor %} {% for obj in querysets %} {% build_table_row obj admin_class %} {% endfor %}
{% endblock %}

?现在访问就可以看到对应列的数据了,但是status显示的是“0”,“1”,我们想要的是“未报名”,“已报名”,还有source,contact_tapy

?

?

?

?

?(5)修改kingadmin_tags.py

因为有的字段有choices,有的字段没有choices,需要添加一个判断

?

? ? models.CustomerInfo._meta.fields? ?获取model所有字段的对象

? ? models.CustomerInfo._meta.get_field("status")? ?取一个字段的对象

? ? get_xxxx_display? ? ? ?显示choices里面的值

?

# kingadmin/templatetags/kingadmin_tags.py

from django.template import Library
from django.utils.safestring import mark_safe

register = Library()

@register.simple_tag
def build_table_row(obj,admin_class):
    """生成一条记录的html element"""

    ele = ""
    for column_name in admin_class.list_display:
        #获取所有字段对象
        column_obj = admin_class.model._meta.get_field(column_name)
        #字段对象的choices方法,如果有choices,则get_xxx_display
        if column_obj.choices:
            column_data = getattr(obj,"get_%s_display"%column_name)()
        else:
            column_data = getattr(obj,column_name)

        td_ele = "%s"%column_data
        ele += td_ele

    return mark_safe(ele)

现在访问页面

?

4.5.添加过滤功能

?

?(1)kingadmin/views.py

# kingadmin/templatetags/kingadmin_tags.py
import datetime

from django.template import Library
from django.utils.safestring import mark_safe

register = Library()

@register.simple_tag
def build_filter_ele(filter_column,admin_class):
    filter_ele = ""%filter_column
    column_obj = admin_class.model._meta.get_field(filter_column)
    try:
        for choice in column_obj.get_choices():
            option = ""%choice
            filter_ele += option

    except AttributeError as e:
        #get_internal_type():获取字段属性
        #因为时间的过滤方式是固定的(今天,过去七天,一个月.....),而不是从后台获取的
        if column_obj.get_internal_type() in ("DateField","DateTimeField"):
            time_obj = datetime.datetime.now()
            time_list = [
                ["","--------"],
                [time_obj,"Today"],
                [time_obj - datetime.timedelta(7),"七天内"],
                [time_obj.replace(day=1),"本月"],
                [time_obj - datetime.timedelta(90),"三个月内"],
                [time_obj.replace(month=1,day=1),"YearToDay(YTD)"],     #本年
                ["","ALL"],
            ]

            for i in time_list:
                option = "" %(i[0],i[1])
                filter_ele += option

    filter_ele += ""

    return mark_safe(filter_ele)

(2)table_obj_list.html

 <div>
            <form>
                {% for filter_column in admin_class.list_filter %}
                    {% build_filter_ele filter_column admin_class %}
                {% endfor %}
                <input type="submit" value="过滤">
            form>
        div>

?访问页面

?

接下来把数据返回到前端

?

(3)kingadmin/views.py

def get_filter_result(request,querysets):
    filter_conditions = {}
    #获取过滤的字段
    for key,val in request.GET.items():
        if val:
            filter_conditions[key] = val
    #返回过滤后的数据
    return querysets.filter(**filter_conditions),filter_conditions


@login_required
def table_obj_list(request, app_name, model_name):
    """取出指定model里的数据返回给前端"""
    #拿到admin_class后,通过它找到拿到model
    admin_class = site.enable_admins[app_name][model_name]
    querysets = admin_class.model.objects.all()
    querysets,filter_conditions = get_filter_result(request,querysets)
    admin_class.filter_conditions = filter_conditions
    return render(request, "kingadmin/table_obj_list.html",{"querysets":querysets,"admin_class":admin_class})

(4)kingadmin_tags.py

当选择过滤条件后,给对应值添加选中状态? selected=selected

?

现在通过时间过滤会报格式不正确的错误

?

?修改时间过滤的格式

?现在不报错了,但并没有过滤出数据

?

?因为其它条件过滤的时候值是等于,但是根据时间过滤应该是大于等于才对

?

?修改kingadmin_tags.py

?

?

?

?

代码已同步??github下载? ?(num4 根据list_display配置生成数据列表和添加过滤功能)

?

当前文章:http://www.tacnic.com/eseg2/97758-1228369-49194.html

发布时间:04:04:01

118图库彩图乖乖图库??一码单双??69177创富高手论坛??68808聚宝盆心水论坛??2018香港赛马会排位表??香港挂牌图??香港挂牌??香港正版挂牌玄机彩图??jk168开奖结果??香港马会现场开奖??

Copyright @ 2016-2017 蜘蛛资讯网 版权所有