Python Django管理员。显示分层下拉过滤器
我有以下型号:Python Django管理员。显示分层下拉过滤器,python,django,django-admin,Python,Django,Django Admin,我有以下型号: from django.db import models class State(models.Model): name = models.CharField(max_length=30) abbreviation = models.CharField(max_length=2) def numberOfCities(self): return self.city_set.count() def __unicode__(sel
from django.db import models
class State(models.Model):
name = models.CharField(max_length=30)
abbreviation = models.CharField(max_length=2)
def numberOfCities(self):
return self.city_set.count()
def __unicode__(self):
return u"{0} - {1}".format(self.abbreviation, self.name)
class City(models.Model):
name = models.CharField(max_length=40)
state = models.ForeignKey(State)
class Meta:
verbose_name_plural = 'Cities'
def __unicode__(self):
return self.name
class Company(models.Model):
name = models.CharField(max_length=60)
description = models.CharField(max_length=1000)
city = models.ForeignKey(City)
class Meta:
verbose_name_plural = 'Companies'
def __unicode__(self):
return self.name;
正如您所看到的,每个公司都与一个城市相关联,正如您所期望的,Django管理员生成包含城市下拉列表的公司创建表单。但是为了改善用户体验,我希望用户首先选择该州,然后在城市下拉列表中填充该州的城市。有没有一种标准的方法可以做到这一点呢?让管理员屈服并不容易,但它只是另一个django应用程序,尽管它非常复杂。我通常会这样做:
Django admin Javascript已经使用了jQuery库。为了避免与用户脚本冲突,Django的jQuery被命名为Django.jQuery。因此,您不必包含第二个副本,您可以在变更列表和添加/编辑视图上使用django.jQuery对象 您需要创建一个自定义小部件来选择城市模型(也就是说,您的模型应该FK到城市而不是状态),此小部件包含两个选择字段,第一个包含Sstates,第二个在选择状态时加载(您需要插入一个视图,根据状态ID返回城市,以填充城市选择) 您应该将窗口小部件媒体内部类点设置为链接两个选择的特定.js文件 在ModelAdmin规范中,将字段的小部件设置为刚创建的自定义小部件,它的媒体将自动添加到change_表单模板中 确保您的.js文件查找常规JQuery对象并返回到django.JQuery,这样您就可以在管理和整个站点中使用相同的小部件
(function($) {
// Note that this function works only for one widget per page
$('#state').change(function(){
$('#city').load('/cities_by_state/', {id: this.value}); // the endpoint returns HTML
});
})(JQuery||django.JQuery);
我在本地用于项目的应用程序中做了类似的事情(可变深度高达三个级别),最终的解决方案有点麻烦,因为它必须支持每页多个小部件、动态小部件(用于内联)、以各种形式呈现小部件的模板标签等等。我喜欢你的方法,但是,我在文档中找不到任何关于如何编写自定义小部件的信息。您能提供一个定制小部件的示例吗?