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">app</h2>

<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 = "<td>%s</td>"%column_data
        ele += td_ele

    return mark_safe(ele)

 

(4)table_obj_list.html

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

然后使用自定義模板標簽:<tr>{% build_table_row obj admin_class %}</tr>

使用的時候需要傳兩個參數進去

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

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

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

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

                </tr>
            </thead>
            <tbody>
                {% for obj in querysets %}
                    <tr>{% build_table_row obj admin_class %}</tr>
                {% endfor %}
                
            </tbody>
        </table>
</div>

{% 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 = "<td>%s</td>"%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 = "<select name='%s'>"%filter_column
    column_obj = admin_class.model._meta.get_field(filter_column)
    try:
        for choice in column_obj.get_choices():
            option = "<option value='%s'>%s</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 = "<option value='%s'>%s</option>" %(i[0],i[1])
                filter_ele += option

    filter_ele += "</select>"

    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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM