ReportLab get_FOO_display() 无法处理列表

ReportLab get_FOO_display() Not Working On A List

我创建了一个用户填写的表格,然后它使用 reportlab 创建他们答案的 pdf。

除了包含列表的字符字段 (preferred_topics) 外,它工作正常。数据是这样保存的:

['ANI', 'EDU', 'ENV']

我认为这可能是个问题,因为 id 会这样保存数据:

[['ANI'], ['EDU'], ['ENV']]

但是在网站上运行良好。

所以要使用 get_FOO_display() 将人类可读的数据打印到 pdf im,但这不适用于 preferred_topics。如果我调用 (user.personalinformation.get_preferred_topics_display() 我得到:

AttributeError at /enrolment/final_question/
'PersonalInformation' object has no attribute 'get_preferred_topics_display'

这是我的其他相关代码:

model.py

preferred_topics = models.CharField(max_length=200, default='')

utils.py

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

    # data that will be printed to the pdf
    page_contents = [
        ['Personal Information'],
        ['Name:', '%s %s' %(user.personalinformation.first_name, user.personalinformation.surname)],
        ['E-mail:', '%s' %(user.email)],
        ['Gender:', '%s' %(user.personalinformation.get_gender_display())],
        # this field is causing grief
        ['Preferred Topics:', '%s' %(user.personalinformation.preferred_topics)]
    ]

forms.py

TOPICS = (
        ('ANI', 'Animals'),
        ('ART', 'Art'),
        ('COM', 'Communication'),
        ('CRI', 'Crime'),
    )

    preferred_topics = forms.MultipleChoiceField(choices=TOPICS, required=False, widget=forms.CheckboxSelectMultiple())

我希望被告知数据被错误地保存在我的数据库中,但不知道如何更改它,并且在我开始更改以前工作的东西之前需要确认,因为我确定我会破坏当前工作的东西过程。

总结 - 我想使用 user.personalinformation.get_preferred_topics_display() 但它不起作用,我怀疑它是因为数据被错误地保存在数据库中,但在我破坏东西之前想要确认。

谢谢。

您将多个选择保存为单个字符串,这不是一个好主意,因为您将很难过滤和处理此类数据(而是使用 Arrayfield of choices)

模型字段中没有 get_FOO_display() 选项,因此您需要编写自己的转换器

# create dict of options
options = dict((y,x) for y,x in PersonalInformationForm.TOPICS)

# evaluate string to list
selected_choices = ast.literal_eval(testobj2.preferred_topics)

# find choices in dict
selected values = [option.get(key) for key in selected_choices]