Как ограничить параметры поля выбора на основе другого поля выбора в Django admin
У меня есть следующие модели:
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-способ" сделать это или пользовательский JavaScript-единственный вариант здесь?
4 ответов
вот некоторые 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.
здесь django-smart-выбирает:
Если у вас есть следующие модели:
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)
вам нужно будет иметь какой-то не-серверный механизм фильтрации объектов. Либо это, либо вы можете перезагрузить страницу, когда выбор сделан (что, вероятно, будет сделано в JavaScript в любом случае).
в противном случае невозможно получить подмножество данных с сервера на клиент.