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
                                                                  })

      

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

  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/andy0816/p/13471764.html
Copyright © 2011-2022 走看看