У меня есть Chart
и модели модулей (см. Код ниже). Каждый график принадлежит модулю (через ForeignKey
). Диаграмма может иметь другую диаграмму как ее parent
(другая ForeignKey
). Я бы хотел, чтобы в админе выпадающий список для parent
на конкретном графике только включает в себя схемы в этом модуле.Django admin: как я могу фильтровать виджет ForeignKeyField на основе данных объекта (а не request.user)?
Я ищу решение Python, а не AJAX. Это означает, что при создании новой диаграммы выпадающее окно должно быть пустым (без экземпляра модели нет выбранного модуля), и что изменение модуля в администраторе не будет обновлять параметры parent
, чтобы они соответствовали, пока модель не будет сохранена. Я в порядке с этим.
Есть много похожих вопросов (и ответов), которые, оказывается, фильтруют параметры в соответствии с пользователем ; ModelAdmin.formfield_for_foreignkey
получает запрос в качестве аргумента, поэтому вы можете использовать request.user
, но он не получает экземпляр модели, с которым можно играть. (Я использую Django 1.3.)
Мои модели (сильно упрощены конечно):
class Module(models.Model):
pass
class Chart(models.Model):
module = models.ForeignKey(Module)
parent = models.ForeignKey(Chart, blank=True, null=True)
class ChartAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
# I would like to do this, but have no "instance":
kwargs['queryset'] = Chart.objects.filter(module=instance.module)
return super(ChartAdmin, self).formfield_for_foreignkey(self, db_field, request, **kwargs)
admin.site.register(Chart, ChartAdmin)
Великое, спасибо! Я добавил редактирование (в очереди), чтобы сделать его безопасным, например, создание (когда self.instance.module вызывает DoNotExist). – Tikitu