zoukankan      html  css  js  c++  java
  • 10-crm项目-kingadmin,删除功能

    删除功能

    (1)kingadmin/urls.py

    urlpatterns = [
        url(r'^$', views.index,name="table_index"),
        url(r'^(w+)/(w+)/$', views.display_table_objs,name="table_objs"),
        url(r'^(w+)/(w+)/(d+)/change/$', views.table_obj_change,name="table_obj_change"),
        url(r'^(w+)/(w+)/(d+)/change/password/$', views.password_reset,name="password_reset"),
        url(r'^(w+)/(w+)/(d+)/delete/$', views.table_obj_delete,name="obj_delete"),
        url(r'^(w+)/(w+)/add/$', views.table_obj_add,name="table_obj_add"),
    
    ]
    
    

    (2) html

    先在修改详情页的html,增加一个删除的按钮:

    {% if not admin_class.readonly_table %}  ------看是否是只读表,如果是只读表,就不会有删除按钮
          <div class="form-group">
    
              {% block obj_delete %}
              <div class="col-sm-2">
                    <a class="btn btn-danger" href="{% url 'obj_delete' app_name table_name form_obj.instance.id %}">Delete</a>
              </div>
              {% endblock %}
              <div class="col-sm-10 ">
                <button type="submit" class="btn btn-success pull-right">Save</button>
              </div>
          </div>
        {% endif %}

    然后新增一个删除页面:

    {% extends 'king_admin/table_index.html' %}
    {% load tags %}
    {% block container %}
    
        {% display_obj_related objs  %}
    
        <ul style="color: red">
        {% for k,v in errors.items %}
            <li>{{ k }}:{{ v }}</li>
        {% endfor %}
        </ul>
        <form method="post">{% csrf_token %}
            <input type="submit" class="btn btn-danger" value="Yes,I'm sure">
            <input type="hidden" value="yes" name="delete_confirm">
            <input type="hidden" value="{{ selected_ids }}" name="selected_ids">
            <input type="hidden" value="{{ action }}" name="action">
            <a class="btn btn-info" href="{% url 'table_objs' app_name table_name  %}">No,Take me back</a>
        </form>
    
    
    {% endblock %}

    删除的时候如果有关联数据要删除,需要提示:

    def recursive_related_objs_lookup(objs):
        #model_name = objs[0]._meta.model_name
        ul_ele = "<ul>"
        for obj in objs:
            li_ele = '''<li> %s: %s </li>'''%(obj._meta.verbose_name,obj.__str__().strip("<>"))
            ul_ele += li_ele
    
            #for local many to many
            #print("------- obj._meta.local_many_to_many", obj._meta.local_many_to_many)
            for m2m_field in obj._meta.local_many_to_many: #把所有跟这个对象直接关联的m2m字段取出来了
                sub_ul_ele = "<ul>"
                m2m_field_obj = getattr(obj,m2m_field.name) #getattr(customer, 'tags')
                for o in m2m_field_obj.select_related():# customer.tags.select_related()
                    li_ele = '''<li> %s: %s </li>''' % (m2m_field.verbose_name, o.__str__().strip("<>"))
                    sub_ul_ele +=li_ele
    
                sub_ul_ele += "</ul>"
                ul_ele += sub_ul_ele  #最终跟最外层的ul相拼接
    
    
            for related_obj in obj._meta.related_objects:
                if 'ManyToManyRel' in related_obj.__repr__():
    
                    if hasattr(obj, related_obj.get_accessor_name()):  # hassattr(customer,'enrollment_set')
                        accessor_obj = getattr(obj, related_obj.get_accessor_name())
                        print("-------ManyToManyRel",accessor_obj,related_obj.get_accessor_name())
                        # 上面accessor_obj 相当于 customer.enrollment_set
                        if hasattr(accessor_obj, 'select_related'):  # slect_related() == all()
                            target_objs = accessor_obj.select_related()  # .filter(**filter_coditions)
                            # target_objs 相当于 customer.enrollment_set.all()
    
                            sub_ul_ele ="<ul style='color:red'>"
                            for o in target_objs:
                                li_ele = '''<li> %s: %s </li>''' % (o._meta.verbose_name, o.__str__().strip("<>"))
                                sub_ul_ele += li_ele
                            sub_ul_ele += "</ul>"
                            ul_ele += sub_ul_ele
    
                elif hasattr(obj,related_obj.get_accessor_name()): # hassattr(customer,'enrollment_set')
                    accessor_obj = getattr(obj,related_obj.get_accessor_name())
                    #上面accessor_obj 相当于 customer.enrollment_set
                    if hasattr(accessor_obj,'select_related'): # slect_related() == all()
                        target_objs = accessor_obj.select_related() #.filter(**filter_coditions)
                        # target_objs 相当于 customer.enrollment_set.all()
                    else:
                        print("one to one i guess:",accessor_obj)
                        target_objs = accessor_obj
    
                    if len(target_objs) >0:
                        #print("33[31;1mdeeper layer lookup -------33[0m")
                        #nodes = recursive_related_objs_lookup(target_objs,model_name)
                        nodes = recursive_related_objs_lookup(target_objs)
                        ul_ele += nodes
        ul_ele +="</ul>"
        return ul_ele
    
    @register.simple_tag
    def display_obj_related(objs):
        '''把对象及所有相关联的数据取出来'''
        #objs = [objs,] #fake
        if objs:
            model_class = objs[0]._meta.model
            mode_name = objs[0]._meta.model_name
            return mark_safe(recursive_related_objs_lookup(objs))

     (3)kingamdin/views.py

    @login_required
    def table_obj_delete(request,app_name,table_name,obj_id):
        admin_class = king_admin.enabled_admins[app_name][table_name]
    
        obj = admin_class.model.objects.get(id=obj_id)
        if  admin_class.readonly_table:
            errors = {"readonly_table": "table is readonly ,obj [%s] cannot be deleted" % obj}
        else:
            errors = {}
        if request.method == "POST":
            if not admin_class.readonly_table:
                obj.delete()
                return redirect("/king_admin/%s/%s/" %(app_name,table_name))
    
        return render(request,"king_admin/table_obj_delete.html",{"obj":obj,
                                                                  "admin_class":admin_class,
                                                                  "app_name": app_name,
                                                                  "table_name": table_name,
                                                                  "errors":errors
                                                                  })

      

    #################

  • 相关阅读:
    CVE-2020-0796 SMB远程代码执行漏洞复现
    SMTP用户枚举原理简介及相关工具
    sqli-labs全通关payload
    ASCII码表
    查看GitHub的历史
    npm安装vue创建一个helloworld程序
    JavaWeb12-Session
    JavaWeb11-Cookie
    JavaWeb10-Servlet实现随机产生图片验证码
    JavaWeb09-Servlet实现下载文件
  • 原文地址:https://www.cnblogs.com/andy0816/p/13471764.html
Copyright © 2011-2022 走看看