2009-04-28 94 views
10

我有以下型号:如何基于在Django管理的另一个选择字段限制选择字段选项

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) 

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

是否有一个“django-way”做到这一点或是自定义JavaScript的唯一选择吗?

+1

在Django模型中真的没有办法设置它吗? – 2010-03-19 20:33:46

+0

是的。与第三方应用程序。看到我的答案。 – 2014-06-09 11:20:07

回答

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列表视图上/项目被称为URL项目。

您可以通过使用model admin media definitions将其挂接到您的管理员。

0

我想JavaScript/AJAX将会是解决这个问题的最佳方法。

+3

似乎更像是对上面答案的评论,而不是它自己的答案。 – boatcoder 2014-06-29 19:03:14

0

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

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

4

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) 
相关问题