如何在Django Admin后台添加一个省市二级联动下拉列表? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
click
V2EX    Django

如何在Django Admin后台添加一个省市二级联动下拉列表?

  •  
  •   click 2013-09-21 10:46:32 +08:00 8928 次点击
    这是一个创建于 4474 天前的主题,其中的信息可能已经有所发展或是发生改变。
    11 条回复    2014-09-03 18:49:13 +08:00
    jianghu52
        1
    jianghu52  
       2013-09-21 12:59:16 +08:00
    django的米有做过,做过一个php的。当时是日文版本,有两个实现方式,一种是用别人提供的js,直接调用js的方法,另外一种是通过一个网站的api,直接连接这个网站的地址外带选择的县的参数,然后这个网站会直接返回给你一个xml文件,你读取这个xml文件就会得到相应县下的市区的名字。
    我估计国内有相同的js,但是有没有类似api网站的那种,就不知道了。
    jianghu52
        2
    jianghu52  
       2013-09-21 12:59:48 +08:00   1
    click
        3
    click  
    OP
       2013-09-21 22:54:54 +08:00
    @jianghu52 你不了解Django,Admin系统是Django 自带的,没法完全自定义
    imcj
        4
    imcj  
       2013-09-21 23:32:55 +08:00
    @click 你不了解Django,django.contrib.admin可以随便自定义,就看你能还是不能。
    jjx
        5
    jjx  
       2013-09-22 12:06:47 +08:00
    @click
    得确是可以,不过过程有点多, 以下代码仅供参考,请自行调整

    1. 定义数据来源, 这里简单的定义一下,如 settings.py

    LOCATION = {"浙江": ["杭州", "宁波"], "湖北": ["武汉"]}

    2. models.py

    COUNTRY = [(key, key) for key in sorted(settings.LOCATION.keys())]

    class Company(models.Model):
    country = models.CharField(max_length=50, null=True, blank=True, verbose_name=_("Country"), choices=COUNTRY)
    state = models.CharField(max_length=50, null=True, blank=True, verbose_name=_('State'))

    3. admin.py


    class CompanyAdminForm(forms.ModelForm):
    state = MyChoiceField(label=_('State'), required=False)

    def locations(self):
    import json

    return json.dumps(settings.LOCATION)

    def __init__(self, *args, **kwargs):
    ins = kwargs.get('instance')
    super(CompanyAdminForm, self).__init__(*args, **kwargs)
    state = self.fields['state']

    if ins and ins.country:
    state.choices = [(item, item) for item in settings.LOCATION.get(ins.country)]

    class Meta:
    model = Company


    class CompanyAdmin(admin.ModelAdmin):

    form = CompanyAdminForm


    4. templates/admin/app/company/change_form.html

    复制原change_form.html内容 在合适位置加入(自行写js代码 )

    <script type="text/Javascript">
    var LOCATION = {{ adminform.form.locations | safe }};

    var $ = django.jQuery;
    $(document).ready(function(){

    $('#id_country').change(function(){

    var country =$(this).val();
    $('#id_state').empty();
    if (country ){

    var state = LOCATION[country];

    var i;
    for (i=0; i < state.length; i++){
    var v = state[i];
    $('#id_state').append("<option value='" + v + "'>" + v + "</option>");
    }

    } else {

    $('#id_stte').append("<option value=''>" + "---------" + "</option>");
    }



    });



    });
    </script>
    jjx
        6
    jjx  
       2013-09-22 12:39:32 +08:00   1
    代码全乱了,没法编辑,看这个链接吧

    http://blog.easynew.com.cn/django-admin-linkage.html
    click
        7
    click  
    OP
       2013-09-27 00:46:54 +08:00   1
    @jjx 谢谢。我目前还没完全看明白。这个方面官方有文档吗?我这个联动列表数据源打算采用json
    click
        8
    click  
    OP
       2013-11-03 10:33:09 +08:00
    还是没搞定……
    cdxfish
        9
    cdxfish  
       2013-12-29 21:01:02 +08:00
    @click 你的理解完全错误, Admin只是自动实现了些功能,你完全可以自定义page,自定义的时候,里面就可以添加自己的 html 和js,或者你干脆点,自己写widgets.......
    click
        10
    click  
    OP
       2013-12-29 22:12:05 +08:00
    @cdxfish 求详细一点讲解,怎么自定义Admin page
    cdxfish
        11
    cdxfish  
       2014-09-03 18:49:13 +08:00 via iPhone   1
    @click你可以先看一下admin的code 简单点的作法可以自己写个page然后把它挂到admin的URL上,再重载一个以有的template加入这个URL 的入口,如果你只想改ui就更简单!你可以从login入手!学Django多看文档,文档没有这看code它有很多值得学习的地方!admin就一app和你平时做的没区别,手机码字,太不方便,见谅
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5864 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 02:32 PVG 10:32 LAX 18:32 JFK 21:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86