直接上代码:

# spark/service/sites.py
from django.conf.urls import url
from django.shortcuts import HttpResponse, render
from django.urls import reverse
from django.utils.safestring import mark_safe class ModelStark(object): def __init__(self, model):
self.model = model
self.model_name = self.model._meta.model_name
self.app_label = self.model._meta.app_label
self.list_display += ModelStark.extra_display def edit(self, obj=None, is_header=None):
if is_header:
return '编辑'
name = "{}_{}_change".format(obj._meta.app_label, obj._meta.model_name)
url = reverse(name, args=(obj.pk,))
return mark_safe("<a href='{}'>编辑</a>".format(url)) def delete(self, obj=None, is_header=None):
if is_header:
return '删除'
name = "{}_{}_delete".format(obj._meta.app_label, obj._meta.model_name)
url = reverse(name, args=(obj.pk,))
return mark_safe("<a href='{}'>删除</a>".format(url)) extra_display = [edit, delete]
list_display = ["__str__"] def list_view(self, request):
# 浏览器标题
name = self.model_name
# 获取数据头
header_list = []
for field_or_func in self.list_display:
# 判断如果是默认配置类的list_display,则数据头为模型表名大写
if field_or_func == '__str__':
header_list.append(self.model_name.upper())
elif callable(field_or_func):
header_list.append(field_or_func(self=self, is_header=True))
else:
field_obj = self.model._meta.get_field(field_or_func)
header_list.append(field_obj.verbose_name)
# 分页器
from utils.pagenator import Pagenation
current_page = request.GET.get('page')
if not current_page:
current_page = 1
base_url = request.path_info
total_books_num = self.model.objects.all().count()
my_pagenator = Pagenation(current_page=current_page, base_url=base_url, books_per_page=10, max_show=7,
total_books_num=total_books_num)
page_html = my_pagenator.page_html
start = my_pagenator.start
end = my_pagenator.end
one_page_data_list = self.model.objects.all()[start:end] # 获取数据表所需数据
new_data_list = []
from django.db.models.fields.related import ManyToManyField
for obj in one_page_data_list:
temp = []
for field_or_func in self.list_display:
if callable(field_or_func):
val = field_or_func(self, obj=obj)
elif field_or_func == '__str__':
val = getattr(obj, field_or_func)
else:
field_obj = self.model._meta.get_field(field_or_func)
if isinstance(field_obj, ManyToManyField):
many_queryset = getattr(obj, field_or_func).all()
val = '|'.join([str(item) for item in many_queryset])
else:
val = getattr(obj, field_or_func)
temp.append(val)
new_data_list.append(temp)
return render(request, 'list_view1.html', locals()) def add_view(self, request):
return HttpResponse('add_view') def change_view(self, request, pk):
return HttpResponse('change_view') def del_view(self, request, pk):
return HttpResponse('del_view') def get_urls(self):
tmp = [] tmp.append(url(r'^$', self.list_view, name="{}_{}_list".format(self.app_label, self.model_name)))
tmp.append(url(r'add/$', self.add_view, name="{}_{}_add".format(self.app_label, self.model_name)))
tmp.append(url(r'(\d+)/delete/$', self.del_view, name="{}_{}_delete".format(self.app_label, self.model_name)))
tmp.append(
url('(\d+)/change/$', self.change_view, name="{}_{}_change".format(self.app_label, self.model_name)))
return tmp, None, None @property
def urls(self):
return self.get_urls() class AdminSite(object):
def __init__(self):
self._registy = {} def register(self, model, stark_class=None):
if not stark_class:
stark_class = ModelStark self._registy[model] = stark_class(model) def get_urls(self):
tmp = []
for model, config_obj in self._registy.items():
tmp.append(url(r"{}/{}/".format(model._meta.app_label, model._meta.model_name), config_obj.urls))
return tmp, None, None @property
def urls(self):
return self.get_urls() site = AdminSite()

# spark/service/sites.py

from stark.service.sites import site, ModelStark
from app01 import models
from django.utils.safestring import mark_safe
from django.urls import reverse print('app01................') class BookStark(ModelStark):
list_display = ['title', 'price', 'publisher', 'authors', ] site.register(models.Book, BookStark) site.register(models.Publish)

# app01/stark.py

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ name }}</title>
<link rel="stylesheet" href="{% static 'css/bootstrap.css' %}"> {# <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet">#}
</head>
<body>
<div class="container"> <div class="row">
<div class="col-md-8"> <table class="table table-bordered">
<thead>
<tr>
{% for list in header_list %}
<th>
{{ list }}
</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for data in new_data_list %}
<tr>
{% for field in data %}
<td>{{ field }}</td>
{% endfor %}
</tr> {% endfor %}
</tbody>
</table> <div>
{{ page_html|safe }}
</div>
</div>
</div>
</div>
</body>
</html>

list_view1.html

from django.shortcuts import render, redirect

class Pagenation():
def __init__(self, current_page, base_url, books_per_page, max_show, total_books_num):
""" :param current_page: 当前访问页面,从request.GET.get('page',1)中获取
:param base_url: 需要访问的url地址
:param books_per_page: 每页显示几条数据
:param max_show: #最多显示几个分页
:param total_books_num: # 传入总计多少条数据记录
"""
self.current_page = current_page
self.base_url = base_url
self.books_per_page = books_per_page
self.max_show = max_show
self.total_books_num = total_books_num
self.__data_start = 0
self.__data_end = 0
self.page_html @property
def start(self):
""" :return: 返回切片数据的开始位置
"""
return self.__data_start @property
def end(self):
"""
返回切片数据的结束位置
:return:
"""
return self.__data_end @property
def page_html(self): """ :return: 返回分页的HTML代码,如果访问不在1~最大页码范围则返回redirect对象,引用的时候要注意。+
"""
page_start = 0
page_end = 0
if self.total_books_num <= 0:
return '没有数据!' total_pages_num, mod = divmod(self.total_books_num, self.books_per_page)
if mod:
total_pages_num = total_pages_num + 1
try:
current_page = int(self.current_page)
except:
current_page = 1 half_num = self.max_show // 2
if current_page <= 0:
current_page = 1
# return redirect('{}?page={}'.format(self.base_url, 1))
elif current_page > total_pages_num:
current_page = total_pages_num
# return redirect('{}?page={}'.format(self.base_url, total_pages_num))
if current_page <= half_num:
page_start = 1
if total_pages_num >= self.max_show:
page_end = self.max_show
else:
page_end = total_pages_num
else:
if current_page + half_num > total_pages_num:
page_end = total_pages_num
if total_pages_num > self.max_show:
page_start = total_pages_num - self.max_show + 1
else:
page_start = 1
else:
page_start = current_page - half_num
page_end = current_page + half_num
self.__data_start = (current_page - 1) * self.books_per_page
self.__data_end = current_page * self.books_per_page
page_html_list = []
ul_start = '<ul class="pagination">'
page_html_list.append(ul_start)
previous_page = '<li class ="enable"><a href="{}?page={}" aria-label="Previous">' \
'<span aria-hidden="true"> « </span> </a> </li>'.format(self.base_url, current_page - 1)
page_html_list.append(previous_page)
first_page = '<li> <a href = "{}?page=1"> 首页 </a> </li>'.format(self.base_url)
page_html_list.append(first_page)
for i in range(page_start, page_end + 1):
if i == current_page:
li = '<li class="active"> <a href="{}?page={}">{}</a> </li>'.format(self.base_url, i, i)
else:
li = '<li> <a href="{}?page={}">{}</a> </li>'.format(self.base_url, i, i)
page_html_list.append(li)
end_page = '<li> <a href="{}?page={}">尾页</a> </li>'.format(self.base_url, total_pages_num)
page_html_list.append(end_page)
last_page = '<li class ="enable"><a href="{}?page={}" aria-label="Next">' \
'<span aria-hidden="true"> » </span> </a> </li>'.format(self.base_url, current_page + 1)
page_html_list.append(last_page)
ul_end = '</ul>'
page_html_list.append(ul_end)
page_html = ''.join(page_html_list)
return page_html

分页器

python全栈开发day85-查:数据表 数据头 增加列 展示多对多字段 反向解析编辑和删除按钮的url的更多相关文章

  1. python 全栈开发,Day114(装饰器,排序规则,显示列,添加按钮,定制ModelForm,自定义列表页面,自定制URL)

    一.装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务处理, ...

  2. python 全栈开发,Day6(is,小数据池,编码转换)

    一.is a = 100 b = 100 print(a == b) print(a is b) 执行输出: TrueTrue 查看内存地址,使用id函数 print(id(a)) print(id( ...

  3. 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType

    回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...

  4. python全栈开发-json和pickle模块(数据的序列化)

    一.什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat ...

  5. python 全栈开发,Day80(博客系统分析,博客主页展示)

    一.博客系统分析 数据库的构建 首先,我们分析一个博客系统的功能: 一个博客可以有多个标签(多对多) 一个博客可以有多条评论(一对多) 一个博客只可以有一个类别(多对一) 接下来,我们分析关系的属性: ...

  6. python全栈开发中级班全程笔记(第二模块、第三章)(员工信息增删改查作业讲解)

    python全栈开发中级班全程笔记 第三章:员工信息增删改查作业代码 作业要求: 员工增删改查表用代码实现一个简单的员工信息增删改查表需求: 1.支持模糊查询,(1.find name ,age fo ...

  7. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  8. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  9. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

随机推荐

  1. Unity3D Shader 入门

    什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这 ...

  2. vue2.x + vux采坑总结(一)

    1.<tab-bar> 切换时,iocn高亮跟着切换问题 vux的Tabbar组件是用来实现底部tab栏,详情见官网文档 , 实现实例截图: 代码如下,控制高亮的是代码凸显部分:selec ...

  3. ubuntu 安装source insight3.5

    版本 ubuntu 16.04 在linux下安装 windows下程序,需要安装wine, wine 是 "“Wine Is Not an Emulator" 缩写. 1) 安装 ...

  4. 将C注册到lua环境中使用

    注册到lua的方式有两种,一种是lua解释器,如果支持动态链接,使用动态链接机制,将函数接口编译成动态链接库,然后将动态链接库放到lua的C路径(LUA_CPATH)中,然后在lua文件中直接使用 r ...

  5. ASP.NET MVC5入门2之Ajax实现数据查询

    开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...

  6. Jquyer table 中的数据分页

    直接上代码,复制出来就可以使用 <!DOCTYPE html> <html> <head lang="en"> <meta charset ...

  7. 04 if条件判断 流程控制

    条件判断 if 语法一: if 条件: # 条件成立时执行的子代码块 代码1 代码2 代码3 示例: sex='female' age=18 is_beautiful=True if sex == ' ...

  8. Oracle12C_____处理数据库01033连接错误问题.sql

    Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administrator&g ...

  9. python之+=与+(转载)

    先看一个简单的例子 从程序分析,进行直接+操作后,python会重新生成一个对象,而进行+=操作并不改变原来的对象,是在原来对象的基础上进行操作,所以+=也称为就地加 除此之外+和+=还有不同: 从程 ...

  10. python的IDE工具-- Pycharm

    我们可以在python的交互环境下编写执行代码,但这只是适合短的代码,当有长的代码时在这里编写就不方便, Python有自带的IDE,根据自己使用的情况来看,感觉Pycharm这款IDE比自带的IDE ...