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("\033[31;1mdeeper layer lookup -------\033[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 })
#################
技术改变命运