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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Django Admin后台添加一个省市二级联动下拉列表相关的知识,希望对你有一定的参考价值。

参考技术A 得确是可以,不过过程有点多, 以下代码仅供参考,请自行调整

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>本回答被提问者和网友采纳

Django Admin Cookbook-24如何从两个不同的模型创建一个Django Admin后台页面

24.如何从两个不同的模型创建一个Django管理员?

Hero模型外联到Category,因此你可以从Hero管理页面中选择一个Category对象。如果还希望能够从Hero管理页面创建及修改Category对象,则可以更改HeroAdmin管理模型,并自定义 save_model行为。

class HeroForm(forms.ModelForm):
    category_name = forms.CharField()
    class Meta:
        model = Hero
        exclude = ["category"]
@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    form = HeroForm
    ....

    def save_model(self, request, obj, form, change):
        category_name = form.cleaned_data["category_name"]
        category, _ = Category.objects.get_or_create(name=category_name)
        obj.category = category
        super().save_model(request, obj, form, change)

更改后,Admin后台显示如下,允许从Hero管理员创建或更新Category对象。

返回目录

以上是关于如何在Django Admin后台添加一个省市二级联动下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin Cookbook-39如何两次向Django管理员添加模型

Django Admin Cookbook-20如何删除模型的“添加”/“删除”按钮

django-17.admin后台管理

Django Admin后台添加用户时出现报错:1452

Django Admin后台管理

Django Admin Cookbook-14如何在Django Admin后台移除“删除所选”操作