Есть игровой объект, каждый из которых может иметь 1 или более платформ. Также каждая игра может иметь 1 или более ссылок на связанные игры (с их собственными платформами). Вот как он выглядит в models.py:Настроить связанные объекты для поля many-to-many в Django
class Game(TimeStampedModel):
gid = models.CharField(max_length=38, blank=True, null=True)
name = models.CharField(max_length=512)
platforms = models.ManyToManyField(
Platform, blank=True, null=True)
...
#here is the self-referencing m2m field
related_games = models.ManyToManyField(
"self", related_name="related", blank=True)
И этой модели подаются с этим кодом в admin.py:
@admin.register(Game)
class GameAdmin(AdminImageMixin, reversion.VersionAdmin):
list_display = ("created", "name", "get_platforms"...)
list_filter = ("platforms", "year",)
#I'm interested in changing the field below
filter_horizontal = ("related_games",)
formfield_overrides = {
models.ManyToManyField: {"widget": CheckboxSelectMultiple},
}
def get_platforms(self, obj):
return ", ".join([p.name for p in obj.platforms.all()])
Мне нужно продлить filter_horizontal = ("related_games ",) часть admin.py - добавить информацию о платформе каждой игры в виджет связанных игр. Он должен выглядеть (название игры и список платформ): «Virtual Fighter (PS4, PSP, PS3)».
Приложение использует Django 1.7 и Python 2.7
Благодарим Вас за внимание.
А что, если такая функциональность нужна только в админ-части и связана только с горизонтальным фильтром? Я новичок в этом проекте и предполагаю, что изменение части __unicode__ может сломать некоторые вещи. –
Я отредактировал ответ, чтобы включить альтернативу вместо переопределения '__unicode__', хотя это определенно не так красно. – ProfSmiles
Первый вариант с __unicode__ отлично работает. Кроме метода join нужны строки, кроме объектов. Поэтому я сделал это следующим образом: «.join ([unicode (p) для p в self.platforms.all()]) –