python測試開發django-57.xadmin選項二級聯動

前言

當咱們選擇項目分類的時候,一個項目下關聯多個模塊,同時有這兩個選項框的時候,須要實現選中一個項目,模塊裏面自動刪除出該項目下的模塊,以下圖這種javascript

解決基本思路:
1.寫個jqeury腳本監聽change事件
2.ajax發個請求給後端,用views試圖函數實現篩選,回傳到頁面上
3.xadmin加載js腳本css

ajax請求

關於moles相關的內容就不重複寫了,打開後臺頁面,查看select標籤的id值,這個id值就是id_和Fieldname的組合
使用了xadmin自帶的selectize.js中的方法html

  • selectize.clearOptions()清空內容
  • selectize.addOption() 添加數據

$("#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);
                }
            })
})

能夠先在瀏覽器上調試下,確保沒問題後,再加載jsjava

views試圖函數和urls.py配置

views.py寫個試圖函數,刪選對應的數據,返回jsonajax

# 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設置一個訪問地址django

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文件,能夠參考以前寫的這篇http://www.javashuo.com/article/p-seahskzy-kc.html
接下來把本身寫的javascript腳本放到/xadmin/static/xadmin/js目錄下json

注意前面要加個分號(;),要否則不生效後端

get_media加載js

xadmin註冊的時候,重寫get_media方法,添加xadmin.add.select.js瀏覽器

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)

主要思路參考這篇博客 http://www.javashuo.com/article/p-xtwbkzts-hy.htmlasync

相關文章
相關標籤/搜索