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" )
|
返回值就是過濾後的值。