python - Django 管理员。显示分层下拉过滤器

标签 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__(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 管理员会生成包含城市下拉列表的公司创建表单。但为了改善用户体验,我希望用户首先选择州,然后城市下拉列表将填充该州的城市。有执行此操作的标准方法吗?

最佳答案

您需要创建一个自定义小部件来选择 City 模型(也就是说,您的模型应该 FK 到 City 而不是 State),这个小部件包含两个 Select 字段,第一个包含 Sstates,第二个被加载在选择一个州时(您需要插入一个 View 以根据州 ID 返回城市以填充您的城市选择)。

您应该将小部件 Media 内部类指向链接两个 Selects 的特定 .js 文件。

在 ModelAdmin 规范中,将您的字段的小部件设置为您刚刚创建的自定义小部件,它的媒体将自动添加到 change_form 模板。

确保您的 .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);

我在本地用于我的项目的应用程序中做了类似的事情(可变深度最多三个级别)并且最终的解决方案有点毛茸茸,因为它必须支持每页多个小部件,动态小部件(用于内联), templatetags 以各种形式呈现小部件等。

关于python - Django 管理员。显示分层下拉过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4917893/

相关文章:

python - 'in fp' 和 'in fp.readlines()' 有什么区别?

python - 使用循环在 plotly 中定义多个 y 轴

python - 无法打开文件 'django-admin.py' : [Errno 2] No such file or directory

python - Django-models 将 dateField 的格式更改为 "DD-MM-YYY"

python - 在 Windows 10 的 Bash Shell 上升级 python

python - Django + Celery + Scrapy 扭曲 react 器(ReactorNotRestartable)和数据库(SSL 错误)错误

sql - 如何在关系数据库中存储智能列表规则

python - Django 手动保存用户配置文件

Django 管理员 : how to sort column by custom method

python - 在 python 中创建接口(interface)和可交换实现