Admin中使用二级联动
参考:
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.change_view
http://www.smallerpig.com/1125.html
https://www.ibm.com/developerworks/cn/opensource/os-django-admin/
默认的django会自动根据我们定义的模型生成form给admin使用,使用到这个form的地方分别是change和add的时候。
最终生成的结果就是可以选择所有的省,也可以选择所有的市,这并不合理,正确的应该是在选择某个省的时候在市的下拉列表里只有该省的城市。
而,django原生并不能做到这么智能。下面介绍一下实现方法:
(1)admin.py
1 2 3 | class RecordAdmin(admin.ModelAdmin): change_form_template = 'admin/extras/record_change_form.html' ... |
使用change_form_template 重置 change_form所使用得模版
(2)在上一步配置的路径下新建html文件 record_change_form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | {% 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_machine_room_id"); console.log(select); select.change(function(){ {# console.log("value change"+django.jQuery(this).val());#} var url = "/report/sub_servers/"+django.jQuery(this).val();//能够正确的访问到view的url {# console.log(url);#} django.jQuery.get( url, function(data){ var target = django.jQuery("#id_server_ip_id"); target.empty();//先要清空一下 data.forEach(function(e){ // 将从view得到的id和db_user名称赋值给db_server的select console.log(e,e.id,e.name); target.append("< option value='"+e.id+"'>"+e.name+"< option >"); target.eq(0).attr('selected', 'true'); }); }) }); }); </ script > {#{{ media }}#} {% endblock %} |
注意:1.继承change_form.html 2.设计好url
(3)在urls.py中添加一条对应的url
urls.py
1 2 3 4 5 6 7 | from django.conf.urls import url from hys_operation import views urlpatterns = [ # url(r'^sub_users/(?P<obj_id>\d+)', views.get_sub_users), url(r '^sub_servers/(?P<obj_id>\d+)' , views.get_sub_servers), ] |
(4)创建views函数
1 2 3 4 5 6 7 8 9 | def get_sub_servers(request, obj_id): # 查找此机房id下的ip servers = MachineInfo.objects. filter (idc = obj_id) result = [] for i in servers: # 对应的id和ip组成一个字典 result.append({ 'id' : i. id , 'name' : i.machine_ip}) # 返回json数据 return HttpResponse(json.dumps(result), content_type = "application/json" ) |
返回值就是过滤后的值。