我有以下型号:
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是唯一的选择?
答案 0 :(得分: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="">-------- </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>
您需要在/ items / URL上调用视图,该视图提供有效项的JSON列表。
您可以使用model admin media definitions将其与管理员挂钩。
答案 1 :(得分:5)
如果您有以下型号:
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)
答案 2 :(得分:0)
我认为JavaScript / AJAX将是解决此问题的最佳方法。
答案 3 :(得分:0)
您需要使用某种基于非服务器的过滤对象机制。或者,或者您可以在进行选择时重新加载页面(无论如何都可能在JavaScript中完成)。
否则,无法将数据子集从服务器获取到客户端。