Задать вопрос
Avillions
@Avillions
PHP Developer at Genesis

Почему в django admin не отображается ManyToManyField если указать through?

Добрый день, у меня есть 3 модели:

class Account(models.Model):
    login = models.CharField(max_length=255)
    password = models.CharField(max_length=255)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    last_name = models.CharField(max_length=255, null=True, blank=True)
    profile_photos = models.ManyToManyField(Photo, related_name='profile_photo', through='ProfilePhoto', blank=True)


class Photo(models.Model):
    photo_name = models.CharField(max_length=255)
    photo_url = models.CharField(max_length=255)


class ProfilePhoto(models.Model):
    account = models.ForeignKey(Account)
    photo = models.ForeignKey(Photo)


Я хочу в django админке при редактировании модели Account редактировать связи profile_photos. Но в админке у меня просто нет этого поля, оно не выводится. Но если я убираю параматр through, то поле появляется. Что интересно, если я пытаюсь редактировать объект Account из консоли, то поле profile_photos есть и доступно. Что я делаю не так?
  • Вопрос задан
  • 3987 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
mututunus
@mututunus
Backend developer (Python, Golang)
Почему бы не сделать так?
class Account(models.Model):
    login = models.CharField(max_length=255)
    password = models.CharField(max_length=255)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    last_name = models.CharField(max_length=255, null=True, blank=True)

class ProfilePhoto(models.Model):
    account = models.ForeignKey(Account)
    photo_name = models.CharField(max_length=255)
    photo_url = models.CharField(max_length=255)
Ответ написан
Это связано с особенностью работы виджетов админки в Джанго. Один из способов переопределить inline класс ваших моделей так:
class ProfilePhotoInline(admin.TabularInline):
    model = ProfilePhoto
    extra = 1


class AccountAdmin(admin.ModelAdmin):
    inlines = (ProfilePhotoInline,)


class ProfilePhotoAdmin(admin.ModelAdmin):
    inlines = (ProfilePhotoInline,)


Далее, там же, просто регистрируем наши модели:
admin.site.register(Account, AccountAdmin)
admin.site.register(ProfilePhoto, ProfilePhotoAdmin)


Подробнее в документации
Ответ написан
Комментировать
та же проблема. Хочу использовать вывод в админке filter_horizontal
без through не создает обещанную в документации промежуточную таблицу, а с through вывод не работает. Суть в том что есть две модели: товары (в них буду отображать 1-2 связанные категории через ForeignKey - строки промежуточной таблицы) и категории в которых связанные товары отображаются с помощью filter_horizontal так как товаров в категории много. Между собой товары и категории связаны М2М (соответственно с промежуточной таблицей через ForeignKey в оной).
надо вот попробовать:
https://pypi.org/project/django-sortedm2m-filter-h...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы