實現原理:
- 繼承admin/change_form.html新添加一段js監聽對應id的select變化,將新得頁面通過admin.py change_form_template = 'apt_data/record_change_form.html' 參數指定新得頁面
- 請求url進行查詢,返回查詢結果,json形式
- 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")