前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python测试开发django-57.xadmin选项二级联动

python测试开发django-57.xadmin选项二级联动

作者头像
上海-悠悠
发布2019-05-13 18:59:53
1.4K0
发布2019-05-13 18:59:53
举报
文章被收录于专栏:从零开始学自动化测试

前言

当我们选择项目分类的时候,一个项目下关联多个模块,同时有这两个选项框的时候,需要实现选中一个项目,模块里面自动删除出该项目下的模块,如下图这种

解决基本思路: 1.写个jqeury脚本监听change事件 2.ajax发个请求给后端,用views试图函数实现筛选,回传到页面上 3.xadmin加载js脚本

ajax请求

关于moles相关的内容就不重复写了,打开后台页面,查看select标签的id值,这个id值就是id_和Fieldname的组合 使用了xadmin自带的selectize.js中的方法

  • selectize.clearOptions()清空内容
  • selectize.addOption() 添加数据
代码语言:javascript
复制
$("#id_p_name").change(function (e) {
            var mid = $(this).val();
            $('#id_m_name')[0].selectize.clearOptions(); //二级select清空选项
            $.ajax({
                type: "get",
                url: "/select_module/?mid=" + mid,
                async: true,
                beforeSend: function (xhr, settings) {
                    xhr.setRequestHeader("X-CSRFToken", $.getCookie("csrftoken"));
                },
                success: function (data) {
                    data = JSON.parse(data.msg)//将JSON转换
                    for (var i = 0; i < data.length; i++) {
                        var test = {text: data[i].fields.module_name, value: data[i].pk, $order: i + 1}; //遍历数据,拼凑出selectize需要的格式
                          $('#id_m_name')[0].selectize.addOption(test); //添加数据
                    }
                },
                error: function (xhr, textStatus) {
                    console.log(xhr);
                    console.log(textStatus);
                }
            })
})

可以先在浏览器上调试下,确保没问题后,再加载js

views试图函数和urls.py配置

views.py写个试图函数,删选对应的数据,返回json

代码语言:javascript
复制
# views.py
from django.http import HttpResponse, JsonResponse
from django.core import serializers
import json
from .models import ModuleName
# Create your views here.

# 二级联动View函数

def select_m(request):
    # 通过get得到父级选择项
    m_id = request.GET.get('mid', '')
    # 筛选出符合父级要求的所有子级,因为输出的是一个集合,需要将数据序列化 serializers.serialize()
    modules = serializers.serialize("json", ModuleName.objects.filter(project_info_id=int(m_id)))
    # 判断是否存在,输出
    if modules:
        return JsonResponse({"msg": modules})

urls.py设置一个访问地址

代码语言:javascript
复制
from django.conf.urls import url
from django.contrib import admin
import xadmin
from hello import views

urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),   # xadmin
    url(r'^admin/', admin.site.urls),     # 原来的admin
    url(r'^select_module/', views.select_m),
]

加载js文件

xadmin加载自己写的js文件,可以参考之前写的这篇https://www.cnblogs.com/yoyoketang/p/10717388.html 接下来把自己写的javascript脚本放到/xadmin/static/xadmin/js目录下

注意前面要加个分号(;),要不然不生效

get_media加载js

xadmin注册的时候,重写get_media方法,添加xadmin.add.select.js

代码语言:javascript
复制
class ApiTestAdmin(object):
    list_display = ["name", "url", "type"]

    def get_media(self):
        # media is the parent's return value (modified by any plugins)
        media = super(ApiTestAdmin, self).get_media() + self.vendor('xadmin.page.list.js', 'xadmin.page.form.js')
        # if self.list_display_links_details:
        #     media += self.vendor('xadmin.plugin.details.js', 'xadmin.form.css')

        # xadmin.list.xxx.js是自己写的js脚本
        media += self.vendor('xadmin.add.select.js', 'xadmin.form.css')
        return media

        # media = super(ControlImage,self).get_media()
        # media.add_js(('js/content.js',))    # 这种方法行不通,会报找不到.add_js方法
        # return media

xadmin.site.register(models.ApiTest, ApiTestAdmin)

主要思路参考这篇博客 https://www.cnblogs.com/ttzz/p/10732405.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • ajax请求
  • views试图函数和urls.py配置
  • 加载js文件
  • get_media加载js
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档