Показать связанные поля из разных моделей в django admin - PullRequest
1 голос
/ 01 мая 2020

У меня есть следующие 3 модели в Django. У нас есть несколько Grades. Каждый Grade имеет несколько subjects. Каждый subject имеет несколько lessons.

class Grade(models.Model):
    name = models.CharField(max_length=100)

class Subject(models.Model):
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE,
                              related_name='subject')

class Lesson(models.Model):
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE,
                                related_name='lesson')

В моей консоли администратора, когда я пытаюсь добавить новый Lesson, я вижу только выпадающий список Subject. Несколько оценок могут иметь одно и то же название предмета. Например: 1 класс имеет предмет engli sh, а 2 класс - предмет engli sh.

Следовательно, я хотел бы видеть раскрывающийся список grade & subject в моей Lesson модели в консоли администратора.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

django -nested-admin - отличный пакет для отображения вложенных моделей в консоли администратора. Это не очень красиво, но делает работу и экономит много накладных расходов.

Хорошо Статья , которая подробно описывает, как использовать этот пакет.

Мой Github репозиторий, содержащий проект django, демонстрирующий использование пакета django -nested-admin.

0 голосов
/ 01 мая 2020

Вы хотите иметь одну страницу администратора для создания Grade, Subject и Lesson объектов. Тем не менее, Django не поддерживает вложенные встроенные внешние ключи. Одни отношения, которые охватывают более одного уровня. У вас есть несколько вариантов.

Вы можете изменить модель Lesson, чтобы она имела прямой FK на Grade и Subject примерно так:

class Lesson(models.Model):
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE,
                                related_name='lesson_subject')
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE,
                              related_name='lesson_grade')

    def save(self, *args, **kwargs):
        self.grade = self.grade.grade
        super().save(*args, **kwargs)

Тогда Вы можете прикрепить LessonInline к GradeAdmin и получить некий вложенный вкладыш.

В качестве альтернативы, есть несколько сторонних Django приложений, которые разрешают вложенный вкладыш. Быстрый поиск в Github или DjangoPackages найдет тот, который соответствует вашим потребностям и вкусам.

...