2009-04-28 84 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) 
相關問題