14

我有以下型号:

class Category(models.Model):
    name = models.CharField(max_length=40)

class Item(models.Model):
    name = models.CharField(max_length=40)
    category = models.ForeignKey(Category)

class Demo(models.Model):
    name = models.CharField(max_length=40)
    category = models.ForeignKey(Category)
    item = models.ForeignKey(Item)

在创建新Demo时的管理界面中,用户从下拉列表中选择类别后,我想限制“项目”下拉列表中的选择数量。如果用户选择另一个类别,则项目选择应相应更新。我想在客户端上限制项目选择,甚至在它到达服务器上的表单验证之前。这是为了可用性,因为项目列表可能超过 1000 个,能够按类别缩小范围将有助于使其更易于管理。

是否有这样做的“django 方式”或者自定义 JavaScript 是这里唯一的选择?

4

3 回答 3

10

这是一些 javascript(基于 JQuery)在类别更改时更改项目选项值:

<script charset="utf-8" type="text/javascript">
  $(function(){
    $("select#id_category").change(function(){
      $.getJSON("/items/",{id: $(this).val(), view: 'json'}, function(j) {
        var options = '<option value="">--------&nbsp;</option>';
        for (var i = 0; i < j.length; i++) {
          options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
        }
        $("#id_item").html(options);
        $("#id_item option:first").attr('selected', 'selected');
      })
      $("#id_category").attr('selected', 'selected');
    })
  })
</script>

您需要在提供有效项目的 JSON 列表的 /items/ URL 上调用视图。

您可以使用模型管理媒体定义将其连接到您的管理员中。

于 2009-04-28T07:07:33.667 回答
7

django-smart-selects

如果您有以下型号:

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = models.ForeignKey(Country)
    area = models.ForeignKey(Area)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)

如果您选择一个大陆,您希望只有位于该大陆的国家/地区可用,并且您可以执行以下操作的区域相同:

from smart_selects.db_fields import ChainedForeignKey 

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = ChainedForeignKey(
        Country, 
        chained_field="continent",
        chained_model_field="continent", 
        show_all=False, 
        auto_choose=True
    )
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)
于 2013-08-07T01:06:07.787 回答
0

您将需要某种基于非服务器的过滤对象机制。要么,要么您可以在进行选择时重新加载页面(这很可能在 JavaScript 中完成)。

否则,无法从服务器获取数据子集到客户端。

于 2009-04-28T09:30:30.313 回答