CRM手记- 12 | Django

# 4.删除
# 在修改记录页面左下角添加一个删除按钮,一个链接,跳转至一个提示删除内容的页面,确认删除;
#     关联删除,删除记录同时也删除外键的关联表;
    # table_obj_common.html
       <div class="form-group">
            <div class="col-sm-10">
                <a href="{% table_obj_delete app_name model_name form_obj.instance.id %}">DELETE</a>
            </div>
        </div>
    # urls.py
        url(r‘^(\w+)/(\w+)/(\d+)/add/$‘, views.table_obj_delete, name="table_obj_delete"),
    # views.py
        @login_required
        def table_obj_delete(app_name,model_name,obj_id):
            """删除记录"""
            admin_class = site.enabled_admins[app_name][model_name]
            obj = admin_class.model.objects.get(id=obj_id)
            return render(request, ‘kingadmin/table_obj_delete.html‘,locals())
    # table_obj_delete.html
        delete {{ obj }}
        <!-- obj代表当前这条记录 -->

# 在删除页面确认,后台删除该记录;
#     >> a = models.CustomerInfo.objects.first()
#     >> a.delete()  # 会不会删除关联的表数据?会;|跟踪记录表;
# django-admin在删除时显示友好提示,列出所有关联表;

# 一层层递归所有外键,删除;
    # table_obj_delete.html
        {% display_all_related_objs obj as all_related_obj_eles%}
        {{ all_related_obj_eles|safe }}
    # kingadmin_tag.py
        @register.simple_tag
        def display_all_related_objs(obj):
            """显示要被删除对象的所有关联对象"""
            ele = "<ul>"
            ele += "<li>%s</i>"%obj
            # 1.forignkey | get_internal_type()
            for reversed_fk_obj in obj._meta.related_objects:
                related_table_name = reversed_fk_obj.name
                related_lookup_key = "%s_set"%related_table_name
                # >> getattr(a,‘customerinfo_set‘) # 获取关联表
                # >> getattr(a,‘customerinfo_set‘).all() # 关联表所有对象
                related_objs = getattr(obj,related_lookup_key).all() # 反向查所有关联数据
                ele += "<li>%s</li><ul>"%related_table_name
                # 如果是many_to_many就不需要深入递归,打印影响的数据
                if reversed_fk_obj.get_internal_type() == "ManyToManyField":
                    for i in related_objs:
                        ele += "<li><a href=‘/kingadmin/%s/%s/%s/change/‘>%s</a> 记录中与%s相关数据将被删除</li>" % (i._meta.app_label,i._meta.model_name,i.id,i, obj) # 课程相关
                else:
                    for i in related_objs:
                        ele += "<li>%s</li>" % i
                        ele += display_all_related_objs(i) # 调用自己,递归查找

                ele += "<ul></li>"
            ele += "</ul>"
            return ele

    # >> a._meta.fields  # 获取所有字段
    # >> a._meta.fields_map # 外链的表映射
    # (‘student‘:<ManyToOneRel:crm.student>,...)
    # >> from crm import models
    # >> a = models.CustomerInfo.objects.all()[1]
    # >> a
    # <CustomerInfo: ‘大西瓜‘> # 学员表中的学生是外键关联着客户表的;一对多反向查询(外键设置在student);
    # >> a.student_set.select_related() # 获取当前查询对象的所有外键字段对应表的查询集:student
    # <QuerySet [<Student:‘大西瓜‘ >]>

    # 只要a._meta.fields_map遇到ManyToOneRel的,就反向去查找:

    # 要考虑自关联,referer_from 转介绍
    # >> a._meta.fields_map
    # (...‘customerinfo‘:<ManyToOneRel:crm.student>...) # 映射中含有当前的表,忽略;

    # 综合:
    # //////a._meta.fields可以获得所有foreignkey # 不需要管,学生删除不影响客户表;
    # a._meta.related_obj 可以获取所有反向关联;而不使用a._meta.fields_map,因为有个脏数据需要判断;
    # a._meta.many_to_many可以获取多对多关系的数据;

    # 多层级递归删除
        # 课程-班级-上课记录-学习记录;
        # 课程被删除,与之多对多关系的客户信息不会被删除,但是字段会收到影响;

    # 给展示记录添加链接跳转查看
    ele += "<li><a href=‘/kingadmin/%s/%s/%s/change/‘>%s</a> 记录中与%s相关数据将被删除</li>" % (app_name,model_name,i.id,i, obj)
    {% display_all_related_objs i._meta.app_label,i._meta.model_name,i.id,i, obj as all_related_obj_eles%}

    # table_obj_delete.html | 点击删除所有关联数据
        <form method=‘post‘>
            {% csrf_token %}
            <input type=‘submit‘ class=‘btn btn-danger‘ value=‘确认删除‘>
            <a>返回</a>
        </form>
    # views.py
        @login_required
        def table_obj_delete(app_name,model_name,obj_id):
            """删除记录"""
            admin_class = site.enabled_admins[app_name][model_name]
            obj = admin_class.model.objects.get(id=obj_id)
            if request.method == ‘POST‘:
                obj.delete()
                return redirect(‘/kingadmin/{app_name}/{model_name}/‘.format(app_name=app_name,model_name=model_name))
            return render(request, ‘kingadmin/table_obj_delete.html‘,locals())

原文地址:https://www.cnblogs.com/pymkl/p/8342060.html

时间: 2024-10-12 04:04:13

CRM手记- 12 | Django的相关文章

CRM手记-2 | Django

#################################### kingadmin ###################################### # 需要做到的效果:点击客户库,出现所有客户信息,以及增删改查|多条件过滤|搜索|排序等功能: # 后台添加相应数量的客户: # 给admin中客户信息显示样式做自定制,包括过滤等: # admin.py class CustomerAdmin(admin.ModelAdmin): list_display = ['name'

CRM手记-8 | Django

# 搜索|在已经过滤的条件之下做搜索; # 在查询语句中,用"包含"来做模糊搜索: # model_class.objects.filter(contact__contains='33') # 涉及到Q的操作;这里通过Q这个类来实现; # table_obj_list.html <form> <input type="search" name="_q"> <input type="submit"

CRM手记-5 | Django

# 过滤补充; # 点击userprofile表报错; # 因为当没有自定义admin_class时,默认使用的是BaseKingAdmin: # 所以,BaseKingAdmin需要做一些默认的配置; # admin_base.py class BaseKingAdmin(object): list_display = [] list_filter = [] search_fields = [] # 此时列表为空,build_table_row()的将没有返回值,前端显示空; # 做一个判断:

CRM手记-6 | Django

# 排序功能开发: # 单条件排序; # 在表头每个字段上都添加a标签,点击降序,记住这次操作,再次点击反序(用箭头图标展示); # table_obj_list.html <th><a href="?_o=">{{ column }}</a></th> # _0等于字段的索引,如果为负,反序; # 所以可以通过模板标签forloop.count0来取; <th><a href="?_o={{forloop.c

12.Django与ajax

Django与ajax 01.AJAX简介: AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML". *同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求 *异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求 *AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新 优点: AJAX使用Javascript技术向服务器发送异步请求 AJAX无须刷新整个页面 0

12.Django基础十之Form和ModelForm组件

一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确.如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.. Django form组件就实现了上面所述的功能. 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 普通方式手写注册功能

12.Django组件-forms组件

forms组件 校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) email=models.EmailField() tel=models.CharField(max_length=32) 模板: register.html: <!DOCTYPE html> <ht

12 Django组件-form组件

知识预览 forms组件 forms组件 校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) email=models.EmailField() tel=models.CharField(max_length=32) 模板:register.html: <!DOCTYPE h

8.12 Django contenttypes组件

contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Contenttypes应用的核心是ContentType模型,位于django.contrib.contenttypes.models.ContentType. ContentType的实例表示并保存项目中安装的模型的信息,每当有新的模型时会自动创建新的ContentType实例. 只要使用django-a