django xadmin后台頁面實現二級聯動


思路

  1. 先找到控件id ,這樣就可以監聽change事件
  2. 然后把自己寫的js加入xadmin中
  3. 添加url和view,接受ajax請求和發送數據

第一步:找到聯動上下級的ID

在瀏覽器中通過F12查看

父級ID:id_files_category1

子級id:id_files_categoty2

 第二步:ajax請求

$('#id_files_category1').change(function () {
        var module = $('#id_files_category1').find('option:selected').val(); //獲取父級選中值
        $('#id_files_category2')[0].selectize.clearOptions();// 清空子級
        $.ajax({
            type: 'get',
            url: '../../select/category1_category2/?module=' + module,
            data: '',
            async: true,
            beforeSend: function (xhr, settings) {
                xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}')
            },
            success: function (data) {
                data = JSON.parse(data.lesson)//將JSON轉換
 
                for (var i = 0; i < data.length; i++) {
 
                    var test = {text: data[i].fields.category_name, value: data[i].pk, $order: i + 1}; //遍歷數據,拼湊出selectize需要的格式
                    console.log(test)
                    $('#id_files_category2')[0].selectize.addOption(test); //添加數據
                }
            },
            error: function (xhr, textStatus) {
                console.log('error')
            }
        })
    })
View Code

需要修改的地方:

我們使用了xadmin自帶的selectize.js中的方法

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

第三步,將js文件放入xadmin中

將js文件命名為按照xadmin/static/xadmin/js中的js文件命名的,否則會報錯,將其放入xadmin/static/xadmin/js目錄下,

第四步,讓xadmin引用我們的js,

找到該文件,修改其中的AdminSelectWidget類,向里面加入我們的js

class AdminSelectWidget(forms.Select):

    @property
    def media(self):
        return vendor('select.js', 'select.css', 'xadmin.widget.select.js','xadmin.widget.categoryselect.js')

第五步:添加URL,我們寫的ajax請求需要后台處理數據

views.py

# 二級聯動View函數
class SelectView(LoginRequiredMixin, View):
    def get(self, request):
        # 通過get得到父級選擇項
        category1_id = request.GET.get('module', '')
        # 篩選出符合父級要求的所有子級,因為輸出的是一個集合,需要將數據序列化 serializers.serialize()
        lessons = serializers.serialize("json", CategoryInfo.objects.filter(category_pid=int(category1_id)))
        # 判斷是否存在,輸出
        if lessons:
            return JsonResponse({'lesson': lessons})

urls.py

url(r'^files/select/category1_category2/', SelectView.as_view(), name='category1_category2'),

完成!

效果圖:

 參考鏈接:https://blog.csdn.net/qq_16102629/article/details/81179250


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM