V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
click
V2EX  ›  Django

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

  •  
  •   click · 2013-09-21 10:46:32 +08:00 · 8305 次点击
    这是一个创建于 3871 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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_state').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   ·   我们的愿景   ·   实用小工具   ·   2817 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:20 · PVG 14:20 · LAX 23:20 · JFK 02:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.