如何根据 django admin 中的另一个选择字段限制选择字段选项
Posted
技术标签:
【中文标题】如何根据 django admin 中的另一个选择字段限制选择字段选项【英文标题】:How to limit choice field options based on another choice field in django admin 【发布时间】:2010-10-22 05:46:24 【问题描述】:我有以下型号:
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 是这里唯一的选择吗?
【问题讨论】:
真的没有办法在 Django 模型中设置这个吗? 是的,有。使用第三方应用程序。看我的回答。 【参考方案1】:这里有一些 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>
您需要在提供有效项目的 JSON 列表的 /items/ URL 上调用视图。
您可以使用 model admin media definitions 将其连接到您的管理员中。
【讨论】:
+1 -> 我正要发布一些非常相似的东西。 OP 只需要使用数据库中的信息填充列表,然后使用您提供的 JS 切换选项 :-) ...或者,如果您不想一次全部加载,您可以在每次用户更改选项时使用一些 ajax 从服务器请求类别。取决于您是想在他们选择时提前接受打击还是延迟他们...... 谢谢乔恩。如果您愿意,您应该继续发布您的代码,该代码在加载时填充列表,而不是像我的 ajax。然后OP可以选择更合适的。 如果我手头有一些我会的... AJAX 是 Django 的一个方面,但我还没有冒险涉足。很快,虽然我很确定 :-)【参考方案2】:您将需要某种基于非服务器的过滤对象机制。要么这样,要么您可以在进行选择时重新加载页面(这很可能在 JavaScript 中完成)。
否则,无法从服务器获取数据子集到客户端。
【讨论】:
【参考方案3】:有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)
【讨论】:
以上是关于如何根据 django admin 中的另一个选择字段限制选择字段选项的主要内容,如果未能解决你的问题,请参考以下文章
根据同一模型中的另一个外键动态限制 Django 模型中外键的选择
使用 Django 根据用户选择的另一个对象属性的值来过滤属性的对象值