Как я могу отфильтровать ManyToManyField на основе ForeignKey в Django? (Что-то вроде Django Smart Select) - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть четыре модели в моем models.py:

models.py

class Course(models.Model):
    course_code = models.CharField(max_length=100,unique=True)
    title = models.CharField(max_length=200)
    short = models.CharField(max_length=50)
    elective_group = models.CharField(max_length=100)

class Unit(models.Model):
    title = models.CharField(max_length=100)
    short = models.CharField(max_length=50)
    course = models.ForeignKey(Course)

class Pattern(models.Model):
    pattern_name = models.CharField(max_length=200)

class ExamSchedule(models.Model):
    exam_date = models.DateTimeField()
    course = models.ForeignKey(Course)
    pattern = models.ForeignKey(Pattern)
    units = models.ManyToManyField(Units)

Все эти модели зарегистрированы на сайте администратора, поэтомучто я могу использовать функциональность администратора для этих моделей.

Моя проблема в том, что когда пользователь создает или редактирует объект ExamSchedule, я хочу, чтобы многозначный виджет единиц (полей) должен содержать только те значения, которые связаны с курсом каккаждый курс может иметь несколько единиц.Поэтому, если пользователь создает объект Examschedule и после выбора курса из раскрывающегося списка виджет единиц измерения должен содержать только те единицы измерения, которые связаны с выбранным курсом.

Django-Smart-Select мог бы быть полезенно он поддерживает только выбранные и сгруппированные выборки по внешнему ключу, а также выборочный выбор ManyToManyField.

Спасибо

1 Ответ

0 голосов
/ 27 августа 2011

Вы можете отправить выбранный курс с запросом Ajax и сделать это, чтобы получить соответствующие единицы.Допустим, вы выбрали communication networks (cn) в качестве курса, в котором вы можете получить связанные единицы, например:

cn_units = Unit.object.filter(course = 'cn').values_list('id',flat=True)

Это вернет единый список всех связанных единиц для этого курса.Вы можете отправить этот список в ответ на ваш запрос ajax, выполнить итерацию по этому списку и заполнить поле выбора для unit в ExamSchedule form.Я считаю простой AJAX, потому что он очень гибкий.

...