zoukankan      html  css  js  c++  java
  • Stark组件

    stark组件就是仿django admin做的一款后台管理工具

    分隔为5大顺序实现

    URL设计

    from django.db import models
    
    # Create your models here.
    
    from django.db import models
    class Author(models.Model):
        nid = models.AutoField(primary_key=True)
        name=models.CharField( max_length=32)
        age=models.IntegerField()
    
        # 与AuthorDetail建立一对一的关系
        authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
    
        def __str__(self):
            return self.name
    
    class AuthorDetail(models.Model):
    
        nid = models.AutoField(primary_key=True)
        birthday=models.DateField()
        telephone=models.BigIntegerField()
        addr=models.CharField( max_length=64)
    
        def __str__(self):
            return self.addr
    
    
    
    class Publish(models.Model):
        nid = models.AutoField(primary_key=True)
        name=models.CharField( max_length=32)
        city=models.CharField( max_length=32)
        email=models.EmailField()
        def __str__(self):
            return self.name
    
    
    class Book(models.Model):
    
        nid = models.AutoField(primary_key=True)
        title = models.CharField( max_length=32)
        publishDate=models.DateField()
        price=models.DecimalField(max_digits=5,decimal_places=2)
    
        # 与Publish建立一对多的关系,外键字段建立在多的一方
        publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
        # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
        authors=models.ManyToManyField(to='Author',)
        def __str__(self):
            return self.title
    models.py
    from django.contrib import admin
    
    from app01.models import *
    # Register your models here.
    
    #注册表名------------------
    admin.site.register(Book)
    admin.site.register(Author)
    admin.py
    from django.conf.urls import url
    from django.contrib import admin
    from django.shortcuts import render,HttpResponse,redirect
    
    #匹配视图部分---------------------------------
    def whq(request):
        return HttpResponse('whq')
    
    def add(request):
        return HttpResponse('增加')
    
    def delete(request):
        return HttpResponse('删除')
    
    def change(request):
        return HttpResponse('修改')
    def list(request):
        return HttpResponse('查看')
    
    #url部分----------------------------------------------
    def get_urls():
        temp=[]
        temp.append(url(r'add/', add),)
        temp.append(url(r'delete/', delete),)
        temp.append(url(r'change/', change),)
        temp.append(url(r'list/', list),)
        return temp
    
    #
    def get_urls2():
        '''
        model:admin.py里注册的表名
        model_config:admin.py里注册表的配置名
    
        :return:
        '''
        temp=[]
        for model,model_config in admin.site._registry.items():
            print(model,model_config)
            #获取APP名称-----------------------
            app_label = model._meta.app_label
            #获取表名------------------------------
            mode_name = model._meta.model_name
            # temp.append(url(r'^%s/%s'%(app_label,mode_name),(get_urls(),None,None) ))
           #添加生成rul---------------------------
            temp.append(url(r'^%s/%s' % (app_label, mode_name), (get_urls(), None, None)))
        return temp
    
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        #输入浏览器后匹配的url--------------------
        url(r'^whq/', (get_urls2(),None,None)),
    ]
    #     url(r'^whq/', ([
    #             url(r'^test01/', test01),
    #             url(r'^test02/', test02),
    #             url(r'^test03/', test03),
    #             url(r'^test04/', test04),
    #
    #                    ],None,None)),
    # ]
    urls.py

     该功能实现了三级url基本思路 http://127.0.0.1:8092/whq/app01/book/list 查看 http://127.0.0.1:8092/whq/app01/book/add 添加 以此类推 

    start注册

     settings文件:

    注册app INSTALLED_APPS = [ 'whqstark.apps.WhqstarkConfig', ] 

    apps.py:
    from
    django.apps import AppConfig from django.utils.module_loading import autodiscover_modules class WhqstarkConfig(AppConfig): name = 'whqstark':app名称 def ready(self): autodiscover_modules('stark')#自动扫描stark.py文件

    增删改查

    查看:

    项目地址:百度云盘密码:t5ho

    from django.conf.urls import url
    from django.contrib import admin
    from django.shortcuts import render,HttpResponse,redirect
    from whqstark.service.stark import site
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        #输入浏览器后匹配的url--------------------
        # url(r'^whq/', (get_urls2(),None,None)),
        url(r'^stark/', site.urls),
    ]
    urls.py
    from whqstark.service.stark import site,ModelStark
    from app01.models import *
    from django.utils.safestring import mark_safe
    from django.urls import reverse
    
    class BookConfig(ModelStark):
    
        def checkbox(self,obj=None,header=False):
            if header:
                return mark_safe('<input id="choice" type="checkbox">')
            return mark_safe('<input id="choice" type="checkbox">')
    
        def edit(self,obj=None,header=False):
            if header:
                return '操作'
            model_name = self.model._meta.model_name
            app_label = self.model._meta.app_label
            _url = reverse('%s_%s_change' % (app_label, model_name), args=(obj.pk,))
            print('uuuuuuuuuuuuuuuuuuuuu',obj.pk)
            return  mark_safe('<a href="%s">编辑</a>'%_url)
    
        def deletes(self, obj=None, header=False):
            if header:
                return '操作'
            model_name = self.model._meta.model_name
            app_label = self.model._meta.app_label
            _url = reverse('%s_%s_delete' % (app_label, model_name), args=(obj.pk,))
            print('xxxxxxxxxxxxxxxxxxxxxxxx', obj.pk)
            return mark_safe('<a href="%s">删除</a>' % _url)
    
        list_display=[checkbox,'title','price','publish',edit,deletes]
        list_display_links=['title']
      
    
    site.register(Book,BookConfig)
    
    site.register(Author)
    stark.py(类似admin)
    from django.conf.urls import url
    from django.utils.safestring import mark_safe
    from django.shortcuts import HttpResponse,render,redirect
    from django.urls import reverse
    class ModelStark(object):
        list_display = ["__str__", ]  #
        list_display_links = []
        def __init__(self,model,site):
            self.model=model#对应的那张表
            self.site=site#单例对象
    
        # 匹配视图部分---------------------------------
        def whq(self, request):
            return HttpResponse('whq')
    
        def add(self, request):
            return HttpResponse('增加')
    
        def delete(self, request, id):
            return HttpResponse('删除')
    
        def change(self, request, id):
            return HttpResponse('修改')
    
    #定制公用-------------- 删除 编辑 复选框--------------------------------------------
        def checkbox(self,obj):
            return mark_safe('<input id="choice" type="checkbox">')
        def edit(self,obj=None,header=False):
            if header:
                return '操作'
            _url=self.get_edit_url(obj)
    
            return "<a href='%s'>编辑</a>" %obj.pk
    
        def deletes(self,obj=None,header=None):
            if header:
                return '操作'
            _url=self.get_delete_url(obj)
            return mark_safe('<a href="%s">删除</a>'%obj.pk)
    
        def new_list_display(self):
            temp=[]
            # temp.append(ModelStark.checkbox)
            temp.extend(self.list_display)#把数据打散,用append是把整个列表放进去
            # temp.append(ModelStark.edit)
            # temp.append(ModelStark.deletes)
            print('ttttttttttttttttttttt',temp)
            return temp
    #-------------------------------------------------------------
    
    
        #生成增删改查4条url---------------------------------------------------
        def get_add_url(self):
           model_name= self.model._meta.model_name
           app_label=self.model._meta.app_label
           _url=reverse('%s_%s_add'%(app_label,model_name),)
           return _url
    
        def get_delete_url(self,obj):
            model_name=self.model._meta.model_name
            app_label=self.model._meta.app_label
            _url=reverse('%s_%s_delete'%(app_label,model_name),args=(obj.pk,))
            return _url
    
        def  get_edit_url(self,obj):
            model_name = self.model._meta.model_name
            app_label = self.model._meta.app_label
            _url=reverse('%s_%s_change'%(app_label,model_name),args=(obj.pk))
            return _url
    
        def get_list_url(self):
            model_name=self.model._meta.model_name
            app_label=self.model._meta.app_label
            _url=reverse('%s_%s_list'%(app_label,model_name))
            return _url
    
    #---------------------------------------------------------------
    
        def list(self, request):
            print(self.model)
            print(self.list_display)
            data_list=self.model.objects.all()
    
            #构建表头---------------------------------------
            header_list=[]
    
            for field in self.new_list_display():
                if callable(field):
                    val = field(self, header=True)#header默认为Flase,为真的话就会执行函数进而返回所定义的返回值
                    header_list.append(val)
                    # header_list.append()
                    # header_list.append(field.__name__,'')#取函数名,for循环的是内存地址
                else:
                    if field=="__str__":#如果这个字段为空的话就显示数据库中显示的__str_-字段
                        header_list.append(self.model._meta.model_name.upper())
                    else:
                        val=self.model._meta.get_field(field).verbose_name#根据list_display里的字段对象取verbose_ame
                        header_list.append(val)
    
    
            new_data_list=[]
            
            for obj in data_list:
                temp=[]#行数据
                for filed in self.list_display:
                    if callable(filed):
                        val=filed(self,obj)
                    else:
                        val= getattr(obj,filed)#字段是字符串的话,反射之后才能obj.字段进行取值
                    temp.append(val)#列数据
            
                new_data_list.append(temp)
            print('nnnnnnnnnnnnnnnnnnnnnnnnnnnn',new_data_list)
    
            return render(request,'list_view.html',locals())
    
    
        def get_urls2(self):
            temp = []
            model_name = self.model._meta.model_name
            app_label = self.model._meta.app_label
            # url部分----------------------------------------------
            temp.append(url(r'add/', self.add, name='%s_%s_add'%(app_label,model_name)), )
            temp.append(url(r'(d+)/delete/', self.delete,name='%s_%s_delete'%(app_label,model_name) ), )
            temp.append(url(r'(d+)/change/', self.change,name='%s_%s_change'%(app_label,model_name), ), )
            temp.append(url(r'list/', self.list,name='%s_%s_list'%(app_label,model_name) ), )
            return temp
    
    
        @property
        def geturls2(self):
            return (self.get_urls2(), None, None)
    
    
    class StarkSite(object):
        def __init__(self):
            self._registry={}
        def register(self,model,stark_class=None):
            if  not stark_class:
                stark_class = ModelStark
            self._registry[model] = stark_class(model, self)  # 飘黄的话是ModelStark类没有变量
    
    
        def get_urls(self):
            temp=[]
            for model ,modelconfig in site._registry.items():
                # 获取APP名称-----------------------
                app_label = model._meta.app_label
                # 获取表名------------------------------
                mode_name = model._meta.model_name
                       #app名字 +类名 +增/删/改/查
                temp.append(url(r'%s/%s' %(app_label, mode_name),modelconfig.geturls2,))
            return temp
    
    
        @property
        def urls(self):
            return self.get_urls(), None,None
    
    
    
    site=StarkSite()
    service
    <!DOCTYPE html>
    <html lang="en">
    {% load static %}
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
    
    
        <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
        <script src="{% static 'jquery-3.2.1.min.js' %}"></script>
        <script src="{% static 'bootstrap/js/bootstrap.js' %}"></script>
        <script src="{% static 'init_ajax.js' %}"></script>
    
        <style>
            .add{
                margin-bottom: 10px;
            }
        </style>
    </head>
    <body>
    
    <h3>list_view页面</h3>
    
    <div class="container">
    
    
    
        <a href="add/" class="btn btn-primary">添加</a>
        <div class="row ">
            <div class="col-md-8">
            <table class="table table-bordered table-striped">
    {#        生成表头#}
                <thead>
                <tr>
                {% for foo in  header_list%}
                    <th>
                    {{ foo }}
                    </th>
    
                {% endfor %}
    
    
                </tr>
                </thead>
                <tbody>
                {% for data in new_data_list %}
                    <tr>
                    {% for item in data %}
                    <td>{{ item }}</td>
                    {% endfor %}
    
                    </tr>
    
                {% endfor %}
    
                </tbody>
    
    
    
    
    
            </table>
    
    
            </div>
        </div>
    </div>
    
    
    
    
    
    </body>
    </html>
    list_views.py

    做完的效果:

      

      list_display_links

        def new_list_display(self):
            temp=[]
            temp.append(ModelStark.checkbox)
            temp.extend(self.list_display)#把数据打散,用append是把整个列表放进去
            #---------------------有list_display_links则不显示编辑字段
            if not self.list_display_links:
                temp.append(ModelStark.edit)
    print('sssssssssssssssssssssssssssss',self.list_display_links)
            temp.append(ModelStark.deletes)
         
            return temp
    class BookConfig(ModelStark):
    
       
        list_display=['title','price','publish']
        list_display_links=['title']
        # print('lllllllllllllllllllllllllll',list_display)
    
    site.register(Book,BookConfig)

    封装查看页面(list):

     

    封装后
    class show_list:
    def __init__(self,config,data_list):
    self.config=config
    self.data_list=data_list
    # 构建表头---------------------------------------
    def get_header(self):
    header_list = []

    for field in self.config.new_list_display():
    if callable(field):
    val = field(self.config, header=True) # header默认为Flase,为真的话就会执行函数进而返回所定义的返回值
    header_list.append(val)
    # header_list.append()
    # header_list.append(field.__name__,'')#取函数名,for循环的是内存地址
    else:
    if field == "__str__": # 如果这个字段为空的话就显示数据库中显示的__str_-字段
    header_list.append(self.config.model._meta.model_name.upper())
    else:
    val = self.config.model._meta.get_field(field).verbose_name # 根据list_display里的字段对象取verbose_ame
    header_list.append(val)
    return header_list
    # print('headerhhhhhhhhhhhhhhhhhhh', header_list)
    def get_body(self):
    # 构建表单数据----------------------------------------
    new_data_list = []

    for obj in self.data_list:
    temp = [] # 行数据
    for filed in self.config.new_list_display():
    if callable(filed):
    val = filed(self.config, obj)
    else:
    val = getattr(obj, filed) # 字段是字符串的话,反射之后才能obj.字段进行取值
    temp.append(val) # 列数据

    new_data_list.append(temp)
    return new_data_list

     

    调用
    def list(self, request):
    print(self.model)
    print(self.list_display)
    data_list=self.model.objects.all()
    showlist=show_list(self,data_list)
     
     <thead>
                <tr>
                {% for foo in showlist.get_header%}
                    <th>
                    {{ foo }}
                    </th>
    
                {% endfor %}
    
    
                </tr>
                </thead>
                <tbody>
                {% for data in showlist.get_body %}
                    <tr>
                    {% for item in data %}
                    <td>{{ item }}</td>
                    {% endfor %}
    
                    </tr>
    
                {% endfor %}
    list

    分页-search-actions

    filter过滤

    POP功能

    def new_list_display(self):
    temp=[]
    temp.append(ModelStark.checkbox)
    temp.extend(self.list_display)#把数据打散,用append是把整个列表放进去
    #---------------------有list_display_links则不显示编辑字段
    if not self.list_display_links:
    temp.append(ModelStark.edit)
    print('sssssssssssssssssssssssssssss',self.list_display_links)
    temp.append(ModelStark.deletes)
    print('ttttttttttttttttttttt',temp)
    return temp
  • 相关阅读:
    Thinkphp无法加载验证码 undefined function Thinkimagettftext() 解决方案 mac系统
    fragment使用不当 导致java.lang.IllegalStateException
    怎样从GitHub项目中,下载单个文件夹或文件
    Android 5.0 app样式
    OpenCV fitline直线拟合函数学习
    Linux文件系统
    Ubuntu 12.04 笔记本触摸板失灵解决方法
    利用微软测试工具PICT生成测试用例
    Myeclipse 使用JUnit 进行单元测试
    Myeclipse 2014 安装checkstyle、PMD和Metrics
  • 原文地址:https://www.cnblogs.com/wanghuaqiang/p/9032524.html
Copyright © 2011-2022 走看看