python全栈开发day85-查:数据表 数据头 增加列 展示多对多字段 反向解析编辑和删除按钮的url
直接上代码:
# 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()
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)