Django-Admin中使用二級聯動

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 in servers:

        # 對應的id和ip組成一個字典

        result.append({'id': i.id'name': i.machine_ip})

    # 返回json數據

    return HttpResponse(json.dumps(result), content_type="application/json")

  返回值就是過濾後的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章