當咱們選擇項目分類的時候,一個項目下關聯多個模塊,同時有這兩個選項框的時候,須要實現選中一個項目,模塊裏面自動刪除出該項目下的模塊,以下圖這種javascript
解決基本思路:
1.寫個jqeury腳本監聽change事件
2.ajax發個請求給後端,用views試圖函數實現篩選,回傳到頁面上
3.xadmin加載js腳本css
關於moles相關的內容就不重複寫了,打開後臺頁面,查看select標籤的id值,這個id值就是id_和Fieldname的組合
使用了xadmin自帶的selectize.js中的方法html
$("#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.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), ]
xadmin加載本身寫的js文件,能夠參考以前寫的這篇http://www.javashuo.com/article/p-seahskzy-kc.html
接下來把本身寫的javascript腳本放到/xadmin/static/xadmin/js目錄下json
注意前面要加個分號(;),要否則不生效後端
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