Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django管理员。显示分层下拉过滤器_Python_Django_Django Admin - Fatal编程技术网

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应用程序,尽管它非常复杂。我通常会这样做:

  • (覆盖change_form.html)
  • 创建一个ajax url,返回按状态id过滤的城市小部件
  • 当状态发生变化时,使用jQuery之类的工具替换City小部件

  • 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);
    

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

    我喜欢你的方法,但是,我在文档中找不到任何关于如何编写自定义小部件的信息。您能提供一个定制小部件的示例吗?