Хорошо, это мое решение с использованием вышеуказанных классов. Я добавил еще несколько фильтров, чтобы правильно отфильтровать его, но я хотел сделать код читаемым здесь.
Это именно то, что я искал, и я нашел свое решение здесь: http: //www.slideshare .net / lincolnloop / customizing-the-django-admin # stats-bottom (слайд 50)
Добавьте следующее в мой admin.py: [
] Это фильтрует список «категорий» без удаления каких-либо функций! (то есть: у меня все еще может быть мой любимый filter_horizontal :))
ModelForms очень мощный, я немного удивлен, что он больше не описан в документации / книге.
Поскольку вы выбираете город и категории клиента в одной и той же форме, вам потребуется некоторый JavaScript, чтобы динамически сократить селектор категорий до категорий, доступных в выбранном городе.
Насколько я могу вас понять, это в основном вы хотите отфильтровать показанные варианты по некоторым критериям (категория по городу).
Вы можете сделать именно это, используя атрибут limit_choices_to
в models.ManyToManyField
. Итак, измените определение модели как ...
class Customer(models.Model):
name = models.CharField(max_length=200)
city = models.ForeignKey(City)
categories = models.ManyToManyField(Category, limit_choices_to = {'available_in': cityId})
Это должно сработать, поскольку limit_choices_to
доступен именно для этой цели.
Но следует отметить одно: limit_choices_to
не имеет эффект при использовании в ManyToManyField с настраиваемой промежуточной таблицей. Надеюсь, это поможет.
Category.objects.filter(available_in=cityobject)
Это должно сработать. В представлении должен быть указан город, выбранный пользователем, либо в запросе, либо в качестве параметра этой функции просмотра.
Как и говорит Райан, должен быть какой-то javascript для динамического изменения параметров в зависимости от того, что выбирает пользователь. Опубликованное решение работает, если город сохранен, а форма администратора перезагружена, то есть когда фильтр работает, но подумайте о ситуации, когда пользователь хочет отредактировать объект, а затем изменяет раскрывающийся город, но параметры в категории не обновляются.