zoukankan      html  css  js  c++  java
  • stark

    一、效果图

    二、增、删、改

     知识点:

    1.解决代码重用
    {% include 'form.html' %}

    2.自定制配置modelform
    每张表,就可自定义配置 labels , widges...
    class BookModelForm(ModelForm):
    class Meta:
    model = Book
    fields = "__all__"
    labels = {
    "title": '书籍名称',
    "price": '价格',
    }
    ...
    modelform_class = BookModelForm
    ModelFormDemo = self.get_modelform_class()

    配置样式,由于不确定字段,得在前端玩!

    3.change_view()
    注意 instance,否则为添加
    form = ModelFormDemo(request.POST, instance=edit_obj)
    if form.is_valid():
    form.save()

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery-1.12.4.min.js"></script>
        <style type="text/css">
            input,select {
                display: block;
                width: 100%;
                height: 34px;
                padding: 6px 12px;
                font-size: 14px;
                line-height: 1.42857143;
                color: #555;
                background-color: #fff;
                background-image: none;
                border: 1px solid #ccc;
                border-radius: 4px;
                -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
                box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
                -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
                -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
                transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
            }
            .error{
                color: red;
            }
    
        </style>
    
    </head>
    <body>
    <h3>添加页面</h3>
    
    {% include 'form.html' %}
    
    
    </body>
    </html>
    add_view.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery-1.12.4.min.js"></script>
        <style type="text/css">
            input,select {
                display: block;
                width: 100%;
                height: 34px;
                padding: 6px 12px;
                font-size: 14px;
                line-height: 1.42857143;
                color: #555;
                background-color: #fff;
                background-image: none;
                border: 1px solid #ccc;
                border-radius: 4px;
                -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
                box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
                -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
                -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
                transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
            }
            .error{
                color: red;
            }
    
        </style>
    
    </head>
    <body>
    <h3>编辑页面</h3>
    
    {% include 'form.html' %}
    
    </body>
    </html>
    change_view.html
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-1">
                <form action="" method="post" novalidate>
                    {% csrf_token %}
                    {% for field in form %}
                        <div>
                            <label for="">{{ field.label }}</label>
                            {{ field }} <span class="error pull-right">{{ field.errors.0 }}</span>
                        </div>
                    {% endfor %}
    
                    <button type="submit" class="btn btn-info">btn</button>
                </form>
    
            </div>
        </div>
    
    </div>
    form.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>删除页面</h3>
    <form action="" method="post">
        {% csrf_token %}
        <button>确认删除吗?</button>
        <a href="{{ url }}">取消</a>
    </form>
    
    </body>
    </html>
    delete_view.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery-1.12.4.min.js"></script>
        <style type="text/css">
    
        </style>
    </head>
    <body>
    
    <h4>数据列表</h4>
    
    <div class="container">
        <div class="row">
            <div class="col-md-9">
                <a href="{{ add_url }}" class="btn btn-primary">添加数据</a>
                <table class="table table-bordered table-striped">
                    <thead>
                        <tr>
                            {% for item in header_list %}
                                <th>{{ item }}</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>
    
    <script type="text/javascript">
        $('#choice').click(function () {
            if($(this).prop('checked')){
                $('.choice_item').prop('checked',true)
            }else{
                $('.choice_item').prop('checked',false)
            }
        })
    
    
    </script>
    
    </body>
    </html>
    list_view.html

    app01/stark.py

    # -*- coding:utf-8 -*-
    from stark.service import stark
    from .models import *
    from django.forms import ModelForm
    
    class BookModelForm(ModelForm):
        class Meta:
            model = Book
            fields = "__all__"
            labels = {
                "title": '书籍名称',
                "price": '价格',
                'publishDate': '出版日期'
            }
    
    
    class BookConfig(stark.ModelStark):
    
        list_display = ['title', 'price','publishDate']
        list_display_links = ['title']
        modelform_class = BookModelForm
    
    stark.site.register(Book, BookConfig)
    stark.site.register(Publish)
    stark.site.register(Author)
    stark.site.register(AuthorDetail)

    stark/service/stark.py

    from django.conf.urls import url
    from django.shortcuts import HttpResponse, reverse, redirect, render
    from django.utils.safestring import mark_safe
    from django.urls import reverse
    from django.forms import ModelForm
    
    
    class ModelStark(object):
        list_display = ["__str__"]
        list_display_links = []
        modelform_class = []
    
        def __init__(self, model, site):
            self.model = model
            self.site = site
    
        def edit(self, obj=None, header=False):
            if header:
                return "操作"
    
            _url = self.get_change_url(obj)
            return mark_safe("<a href='%s'>编辑</a>" % _url)
    
        def deletes(self, obj=None, header=False):
            if header:
                return '操作'
    
            _url = self.get_delete_url(obj)
            return mark_safe("<a href='%s'>删除</a>" % _url)
    
        def checkbox(self, obj=None, header = False):
            if header:
                return mark_safe("<input id='choice' type='checkbox'>")
            return mark_safe("<input class='choice_item' type='checkbox'>")
    
        def get_modelform_class(self):
            if not self.modelform_class:
                class ModelFormDemo(ModelForm):
                    class Meta:
                        model = self.model
                        fields = "__all__"
                        # 得在前端玩
                        # widgets = {
                        #     "title":wid.TextInput(attrs={'class':'form-control'})
                        # }
                        # 得自定制去配置
                        # labels = {
                        #     "title":'书籍名称'
                        # }
                return ModelFormDemo
            else:
                return self.modelform_class
    
        def add_view(self, request):
            ModelFormDemo = self.get_modelform_class()
            form = ModelFormDemo()
    
            if request.method == 'POST':
                form = ModelFormDemo(request.POST)
                if form.is_valid():
                    form.save()
                    return redirect(self.get_list_url())
    
            return render(request, 'add_view.html', locals())
    
        def delete_view(self, request, delete_id):
            url = self.get_list_url()
    
            if request.method == 'POST':
                self.model.objects.filter(pk=delete_id).delete()
                return redirect(url)
    
            return render(request, 'delete_view.html', locals())
    
        def change_view(self, request, change_id):
            ModelFormDemo = self.get_modelform_class()
            edit_obj = self.model.objects.filter(pk=change_id).first()
            form = ModelFormDemo(instance=edit_obj)
    
            if request.method == "POST":
                form = ModelFormDemo(request.POST, instance=edit_obj)
                if form.is_valid():
                    form.save()
                    return redirect(self.get_list_url())
    
            return render(request,'change_view.html', locals())
    
        def new_list_play(self):
            temp = []
            temp.append(ModelStark.checkbox)
            temp.extend(self.list_display)
            temp.append(ModelStark.edit)
            temp.append(ModelStark.deletes)
    
            return temp
    
        def get_change_url(self, obj):
            model_name = self.model._meta.model_name
            app_lable = self.model._meta.app_label
    
            _url = reverse("%s_%s_change" % (app_lable, model_name), args=(obj.pk,))
    
            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_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_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_view(self, request):
            data_list = self.model.objects.all()
    
            # 构建表头
            header_list = []
            # header_list = ['选择','pk',...'操作','操作']
            for field in self.new_list_play():
                if callable(field):
                    val = field(self, header = True)
                else:
                    if field == "__str__":
                        val = self.model._meta.model_name.upper()
                    else:  # 根据str 拿字段对象 取中文
                        val = self.model._meta.get_field(field).verbose_name
    
                header_list.append(val)
    
            # 构建表单
            new_data_list = []
            for data in data_list:
                temp = []
                for field in self.new_list_play():  # ['title','price'] 字符串找对象得属性 反射
                    print('field:', field)
                    if callable(field):
                        val = field(self, data)
                    else:
                        val = getattr(data, field)
    
                        if field in self.list_display_links:
                            _url = self.get_change_url(data)
                            val = mark_safe("<a href='%s'>%s</a>" % (_url, val))
    
                    temp.append(val)
    
                new_data_list.append(temp)   # [['yuan', 12], ['alex', 18], ['egon', 22]]
    
            # 构建一个查看url
            add_url = self.get_add_url()
            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
    
            temp.append(url(r'add/', self.add_view, name="%s_%s_add" % (app_label, model_name)))
            temp.append(url(r'(d+)/delete/', self.delete_view, name="%s_%s_delete" % (app_label, model_name)))
            temp.append(url(r'(d+)/change/', self.change_view, name="%s_%s_change" % (app_label, model_name)))
            temp.append(url(r'^$', self.list_view, name="%s_%s_list" % (app_label, model_name)))
    
            return temp
    
        @property
        def urls2(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)
    
    
        def get_urls(self):
            temp = []
            
            # 模型表,配置类对象
            for model, stark_class_obj in self._registry.items():
                model_name = model._meta.model_name
                app_label = model._meta.app_label
    
                # 分发增删改查
                temp.append(url(r'%s/%s/'%(app_label,model_name), stark_class_obj.urls2))
    
            return temp
    
        @property
        def urls(self):
    
            return self.get_urls(), None, None
    
    
    site = StarkSite()
  • 相关阅读:
    koa 基础(十)原生node.js 在 koa 中获取表单提交的数据
    koa 基础(九) ejs 模板引擎的使用
    koa 基础(八)koa 中间件的执行顺序
    koa 基础(七)错误处理中间件
    [翻译] KVNProgress
    编写带有点击特效的UIButton
    用Easing函数实现碰撞效果
    EasingAnimation
    什么时候会执行viewDidLoad方法
    UIButton的两种block传值方式
  • 原文地址:https://www.cnblogs.com/alice-bj/p/9211217.html
Copyright © 2011-2022 走看看