Как ограничить параметры поля выбора на основе другого поля выбора в django admin - PullRequest
11 голосов
/ 28 апреля 2009

У меня есть следующие модели:

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 ]

10 голосов
/ 28 апреля 2009

Вот некоторый 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>

Вам необходимо вызвать представление для / items / URL, которое предоставляет JSON-список допустимых элементов.

Вы можете подключить это к своему администратору, используя определения модели администратора СМИ .

5 голосов
/ 07 августа 2013

Существует 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)
0 голосов
/ 28 апреля 2009

Вам понадобится какой-то не серверный механизм фильтрации объектов. Либо так, либо вы можете перезагрузить страницу, когда сделан выбор (что, скорее всего, будет сделано в JavaScript в любом случае).

В противном случае невозможно получить подмножество данных с сервера на клиент.

0 голосов
/ 28 апреля 2009

Думаю, JavaScript / AJAX будет лучшим подходом к этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...