Report Lab Печать значений из форм, а не из базы данных

У меня есть веб-сайт, на котором пользователи должны заполнить большую анкету, разбросанную по четырем веб-страницам (и четырем формам), и после заполнения анкеты reportlab создает PDF-файл их ответов.

Вот мой рабочий код

utils.py

def generate_pdf(request):
    # get user
    user = request.user

    # get users age
    born = request.user.personalinformation.dob
    age = user_utils.get_age(born)

    doc = SimpleDocTemplate(settings.MEDIA_ROOT+'\pdf_templates\\enrolment_form_%s.pdf' %user.id)
    styles = getSampleStyleSheet()
    enrolment_form = [Spacer(1,2*inch)]
    style = styles["Normal"]

    page_contents = [
    ("Name: %s %s" % (user.personalinformation.first_name, user.personalinformation.surname)),
    ("Gender: %s" % (user.personalinformation.gender)),
    ("Age: %s" % (age))
    ]

    for sections in page_contents:
        p = Paragraph(sections, style)
        enrolment_form.append(p)
        enrolment_form.append(Spacer(1,0.2*inch))

    doc.build(enrolment_form)

модели.py

class PersonalInformation(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    GENDERS = (
        ('M', 'Male'),
        ('F', 'Female'),
    )

    first_name = models.CharField(max_length=200, default='')
    surname = models.CharField(max_length=200, default='')
    gender = models.CharField(max_length=1, choices=GENDERS)
    dob = models.DateTimeField('Date of birth (mm/dd/yyyy)', null=True, default=now)

    def __str__(self):
        return f'{self.user.username}'

(У меня также есть form.py, но я не думаю, что его стоит включать)

Это работает нормально, за исключением таких полей, как «пол». Потому что он получает значения, которые печатает в pdf из user.personalinformation из базы данных, вместо печати «Пол: мужской», печатает «Пол: M». Хотя этот пример кажется тривиальным, есть еще много полей с парами ключ/значение и логическими значениями, которые не имеют смысла печататься таким образом.

Как я могу распечатать значения по мере их отображения в форме и для пользователя, а не распечатывать значения, сохраненные в базе данных?

Спасибо.


person Brenden    schedule 23.05.2020    source источник


Ответы (1)


Согласно документации field.choices

Для каждого поля модели, в котором установлены варианты выбора, Django добавит метод для получения удобочитаемого имени для текущего значения поля. См. get_FOO_display() в документации API базы данных.

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

user.personalinformation.get_gender_display()
person iklinac    schedule 23.05.2020
comment
Большое спасибо. Именно то, что я был после - person Brenden; 24.05.2020