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

2013-09-21 10:46:32 +08:00
 click
8483 次点击
所在节点    Django
11 条回复
jianghu52
2013-09-21 12:59:16 +08:00
django的米有做过,做过一个php的。当时是日文版本,有两个实现方式,一种是用别人提供的js,直接调用js的方法,另外一种是通过一个网站的api,直接连接这个网站的地址外带选择的县的参数,然后这个网站会直接返回给你一个xml文件,你读取这个xml文件就会得到相应县下的市区的名字。
我估计国内有相同的js,但是有没有类似api网站的那种,就不知道了。
jianghu52
2013-09-21 12:59:48 +08:00
click
2013-09-21 22:54:54 +08:00
@jianghu52 你不了解Django,Admin系统是Django 自带的,没法完全自定义
imcj
2013-09-21 23:32:55 +08:00
@click 你不了解Django,django.contrib.admin可以随便自定义,就看你能还是不能。
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
2013-09-22 12:39:32 +08:00
代码全乱了,没法编辑,看这个链接吧

http://blog.easynew.com.cn/django-admin-linkage.html
click
2013-09-27 00:46:54 +08:00
@jjx 谢谢。我目前还没完全看明白。这个方面官方有文档吗?我这个联动列表数据源打算采用json
click
2013-11-03 10:33:09 +08:00
还是没搞定……
cdxfish
2013-12-29 21:01:02 +08:00
@click 你的理解完全错误, Admin只是自动实现了些功能,你完全可以自定义page,自定义的时候,里面就可以添加自己的 html 和js,或者你干脆点,自己写widgets.......
click
2013-12-29 22:12:05 +08:00
@cdxfish 求详细一点讲解,怎么自定义Admin page
cdxfish
2014-09-03 18:49:13 +08:00
@click你可以先看一下admin的code 简单点的作法可以自己写个page然后把它挂到admin的URL上,再重载一个以有的template加入这个URL 的入口,如果你只想改ui就更简单!你可以从login入手!学Django多看文档,文档没有这看code它有很多值得学习的地方!admin就一app和你平时做的没区别,手机码字,太不方便,见谅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/83153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX