Как объединить 2 атрибута для создания имени в экземпляре модели Django? - PullRequest
2 голосов
/ 24 апреля 2020

У меня есть модель:

class Subject(models.Model):
    level = models.CharField(choices=LEVEL_CHOICES, max_length=2)
    subject_name = models.CharField(max_length=50)
    teacher_name = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    total_seats = models.IntegerField()
    subject_details = models.CharField(max_length=100)
    subject_img = models.ImageField()

Я хочу отобразить каждый экземпляр как уровень, а затем имя субъекта. Например, если у экземпляра level 'Advanced' и subject_name как 'Physics', я хочу, чтобы экземпляр отображался как 'Advanced Physics'.

Я пытался использовать str метод, но он показывает subject_name не определено:

def __str__(self):
        return self.level+ ''+ subject_name

РЕДАКТИРОВАТЬ:

Я забыл упомянуть, что поле level принимает выбор, вот так:

LEVEL_CHOICES = (
    ('09', 'Class 9 O level'),
    ('10', 'Class 10 O level'),
    ('11', 'AS level'),
    ('12', 'A2 level'),
)

Как отобразить данные, которые видны человеку? ie. те, что справа level

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вам необходимо обратиться к self, чтобы получить доступ к subject_name как таковой:

def __str__(self):
        return self.level + ' ' + self.subject_name

или отформатирован с помощью Python3:

def __str__(self):
        return '{0} {1}'.format(self.level, self.subject_name)

и получить удобочитаемое человеком значение, вы можете просто использовать метод .get_FOO_display():

def __str__(self):
        return '{0} {1}'.format(self.get_level_display(), self.subject_name)

Model.get_FOO_display (): https://docs.djangoproject.com/en/3.0/ref/models/instances/#django .db.models.Model.get_FOO_display

1 голос
/ 24 апреля 2020

Это атрибуты, определенные для объекта self, поэтому вы можете реализовать это следующим образом:

    def __str__(self):
        return self.level + '' + <b>self.</b>subject_name

или, возможно, здесь можно использовать форматирование строки:

    def __str__(self):
        return f'{self.level}{self.subject_name}'

Если вы хотите Чтобы использовать отображаемое значение для выбора level, вы можете вызвать метод get_level_display:

    def __str__(self):
        return self.<b>get_level_display()</b> + '' + self.subject_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...