Django admin select二級聯動效果


實現原理:

  1. 繼承admin/change_form.html新添加一段js監聽對應id的select變化,將新得頁面通過admin.py change_form_template = 'apt_data/record_change_form.html' 參數指定新得頁面
  2. 請求url進行查詢,返回查詢結果,json形式
  3. js拿到結果,重新渲染select option

缺點:
目前不太靈活,如果可以通過admin.py指定一個select參數就好了

代碼參考:

  • admin.py

    @admin.register(AptReport)
    class AptReportAdmin(ExportCsvMixin,admin.ModelAdmin):
    	actions = ["export_as_csv"]
    
    	change_form_template = 'apt_data/record_change_form.html'
    	list_per_page = 10
    	list_display = ["id", "report_name", ...]
    
  • apt_data/record_change_form.html

{% extends "admin/change_form.html" %}
{% load i18n admin_urls static admin_modify %}

{% block extrahead %}{{ block.super }}
<script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
    <script>
        django.jQuery(function() {
            var select = django.jQuery("#id_attack_method_class");
            select.change(function(){
                console.log("value change"+django.jQuery(this).val());
                var url = "/apt_main/form_ttp/?fid="+django.jQuery(this).val();
                django.jQuery.get(
                    url,
                    function(data){
                        var target = django.jQuery("#id_attack_method_ttp");
                        target.empty();
                        data.forEach(function(e){
                            target.append("<option value='"+e.id+"'>"+e.attack_method_ttp+"<option>");
                            target.eq(0).attr('selected', 'true');
                        });
                });
        })
        });
    </script>
{% endblock %}
  • url.py

    app_name="apt_main"
    urlpatterns = [
    	path('form_ttp/', views.SelectView.as_view()),
    ]
    
  • view.py

    class SelectView(LoginRequiredMixin, View):
    	'''
    	處理attack二級聯動數據請求
    	'''
    
    	def get(self, request):
    		# 通過get得到父級選擇項
    		attack_method_class = request.GET.get('fid', '')
    		# 篩選出符合父級要求的所有子級,因為輸出的是一個集合,需要將數據序列化 serializers.serialize()
    		result = AptAttackMethodTTP.objects.filter(attack_method_class=attack_method_class).values("id","attack_method_ttp")
    		data = [x for x in result]
    		return HttpResponse(json.dumps(data),content_type="application/json")
    


免責聲明!

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



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