博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
strak组件(6):列表定制列应用和引入静态文件
阅读量:7238 次
发布时间:2019-06-29

本文共 9718 字,大约阅读时间需要 32 分钟。

效果图:

 

 

新增函数

def get_choice_text(title, field)   闭包函数,显示choice字段    def inner(self, obj=None, is_header=None) def display_edit(self, obj=None, is_header=None)  显示编辑 def display_delete(self, obj=None, is_header=None) 显示删除

 

一、Model

web/models.py

class UserInfo(models.Model):    """    用户表    """    MALE = 1    FEMALE = 2    GENDER_CHOICES = (        (MALE, '男'),        (FEMALE, '女'),    )    CLASSES_CHOICES = (        (1, 'python一班'),        (2, 'python二班'),    )    name = models.CharField(verbose_name='姓名', max_length=32)    age = models.CharField(verbose_name='年龄', max_length=32)    email = models.CharField(verbose_name='邮箱', max_length=32)    gender = models.PositiveIntegerField(verbose_name='性别', choices=GENDER_CHOICES, default=MALE)    classes = models.PositiveIntegerField(verbose_name='班级', choices=CLASSES_CHOICES, default=1)    department = models.ForeignKey(verbose_name='部门', to='Department', on_delete=models.CASCADE)    def __str__(self):        return self.name

 

二、stark

stark/service/core_func.py

from types import FunctionTypefrom django.urls import re_pathfrom django.utils.safestring import mark_safefrom django.shortcuts import HttpResponse, render, reversedef get_choice_text(title, field):    """    对于Stark组件中定义列时,choice如果想要显示中文信息,调用此方法即可。    :param title: 希望页面显示的表头    :param field:  字段名称    :return:    """    def inner(self, obj=None, is_header=None):        if is_header:            return title        method = "get_%s_display" % field        return getattr(obj, method)()        # GENDER_CHOICES = ((MALE, '男'),(FEMALE, '女'),)        # 对于choice字段,如果想获取获取第二个值,可以通过:对象.get_字段名_display()    return innerclass StarkHandler(object):    list_display = []    def __init__(self, site, model_class, prev):        self.site = site        self.model_class = model_class        self.prev = prev    def display_edit(self, obj=None, is_header=None):        """        自定义页面显示的列(表头和内容)        :param obj:        :param is_header:        :return:        """        if is_header:            return '编辑'        name = '%s:%s' % (self.site.namespace, self.get_edit_url_name,)        return mark_safe('编辑' % reverse(name, args=(obj.pk,)))    def display_delete(self, obj=None, is_header=None):        if is_header:            return '删除'        name = '%s:%s' % (self.site.namespace, self.get_delete_url_name,)        return mark_safe('删除' % reverse(name, args=(obj.pk,)))    def get_list_display(self):        """        获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的列        :return:        """        value = []        value.extend(self.list_display)        return value    def list_view(self, request):        """        列表页面        :param request:        :return:        """        list_display = self.get_list_display()  # 会优先调用UserInfoHandler里的get_list_display()方法。        # 1. 处理表格的表头        header_list = []        if list_display:            for field_or_func in list_display:                if isinstance(field_or_func, FunctionType):                    verbose_name = field_or_func(self, obj=None, is_header=True)                else:                    verbose_name = self.model_class._meta.get_field(field_or_func).verbose_name                header_list.append(verbose_name)        else:            header_list.append(self.model_class._meta.model_name)  # 如果用户没有填写list_display,就显示表名        # 2. 处理表的内容        data_list = self.model_class.objects.all()        body_list = []        for obj in data_list:            tr_list = []            if list_display:                for field_or_func in list_display:                    if isinstance(field_or_func, FunctionType):                        tr_list.append(field_or_func(self, obj, is_header=False))                    else:                        tr_list.append(getattr(obj, field_or_func))            else:                tr_list.append(obj)  # 如果用户没有填写list_display,就显示表对象,所以表类要定义__str__方法            body_list.append(tr_list)        context = {            'data_list': data_list,            'header_list': header_list,            'body_list': body_list,        }        return render(request, 'stark/data_list.html', context)    def add_view(self, request):        """        添加页面        :param request:        :return:        """        return HttpResponse('添加页面')    def edit_view(self, request, pk):        """        编辑页面        :param request:        :return:        """        return HttpResponse('编辑页面')    def delete_view(self, request, pk):        """        删除页面        :param request:        :param pk:        :return:        """        return HttpResponse('删除页面')    def get_url_name(self, params):        app_label, model_name = self.model_class._meta.app_label, self.model_class._meta.model_name        if self.prev:            return '%s_%s_%s_%s' % (app_label, model_name, self.prev, params)        return '%s_%s_%s' % (app_label, model_name, params)    @property    def get_list_url_name(self):        """        获取列表页面URL的name        :return:        """        return self.get_url_name('list')    @property    def get_add_url_name(self):        """        获取添加页面URL的name        :return:        """        return self.get_url_name('add')    @property    def get_edit_url_name(self):        """        获取编辑页面URL的name        :return:        """        return self.get_url_name('edit')    @property    def get_delete_url_name(self):        """        获取删除页面URL的name        :return:        """        return self.get_url_name('delete')    def get_urls(self):        patterns = [            re_path(r'^list/$', self.list_view, name=self.get_list_url_name),            re_path(r'^add/$', self.add_view, name=self.get_add_url_name),            re_path(r'^edit/(\d+)/$', self.edit_view, name=self.get_edit_url_name),            re_path(r'^delete/(\d+)/$', self.delete_view, name=self.get_delete_url_name),        ]        patterns.extend(self.extra_urls())        return patterns    def extra_urls(self):        return []class StarkSite(object):    def __init__(self):        self._registry = []        self.app_name = 'stark'        self.namespace = 'stark'    def register(self, model_class, handler_class=None, prev=None):        """        :param model_class: 是models中的数据库表对应的类。        :param handler_class: 处理请求的视图函数所在的类        :param prev: 生成URL的前缀        :return:        """        if not handler_class:            handler_class = StarkHandler        self._registry.append(            {
'model_class': model_class, 'handler': handler_class(self, model_class, prev), 'prev': prev}) def get_urls(self): patterns = [] for item in self._registry: model_class = item['model_class'] handler = item['handler'] prev = item['prev'] app_name, model_name = model_class._meta.app_label, model_class._meta.model_name if prev: patterns.append( re_path(r'^%s/%s/%s/' % (app_name, model_name, prev,), (handler.get_urls(), None, None))) else: patterns.append(re_path(r'^%s/%s/' % (app_name, model_name,), (handler.get_urls(), None, None))) return patterns @property def urls(self): return self.get_urls(), self.app_name, self.namespacesite = StarkSite()

 

三、业务处理

web/stark.py

from stark.service.core_func import site, StarkHandler, get_choice_textfrom web import modelsclass DepartmentHandler(StarkHandler):    list_display = ['title']class UserInfoHandler(StarkHandler):    list_display = [        'name',        get_choice_text('性别', 'gender'),        get_choice_text('班级', 'classes'),        'age', 'email', 'department',        StarkHandler.display_edit,        StarkHandler.display_delete,    ]site.register(models.Department, DepartmentHandler) site.register(models.UserInfo, UserInfoHandler)

 

四、引入静态文件

引入了bootstrap

stark/templates/layout.html

{% load staticfiles %}    
Strak组件
{% block css %}{% endblock %}
{% block content %} {% endblock %}
{% block js %} {% endblock %}

 

 

stark/templates/stark/data_list.html

{% extends 'layout.html' %}{% block content %}    
{% for item in header_list %}
{% endfor %}
{% for row in body_list %}
{% for ele in row %}
{% endfor %}
{% endfor %}
{
{ item }}
{
{ ele }}
{% endblock content %}

 

转载于:https://www.cnblogs.com/lshedward/p/10566501.html

你可能感兴趣的文章
低配置电脑播放 flash 视频时 占 cpu 资源过高的解决方法
查看>>
linux下ssh/sftp配置和权限设置
查看>>
js面向对象编程两个主要点
查看>>
Xml通用操作类
查看>>
CSS常见以及解决兼容办法
查看>>
含参数的二次不等式的解法【中级和高阶辅导】
查看>>
Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述
查看>>
利用border-radious画图形
查看>>
Java并发编程(二)同步
查看>>
linux下top命令查看cpu占用情况
查看>>
jenkins+maven+junit构建自动化测试,整合junit xml生成直观的测试报告[留存]
查看>>
ol,ul,dl,table标签的基本语法
查看>>
bzoj4197
查看>>
又是每周作业~4.1
查看>>
理解项目编辑器---part1:创建项目编辑器
查看>>
iOS所有常见证书,appID,Provisioning Profiles配置说明及制作图文教程
查看>>
hibernate--一对多单向关联 (重点!!!)
查看>>
[Union]C++中Union学习笔记
查看>>
python面向对象三大特征
查看>>
iOS - SQLite 数据库存储
查看>>