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]
我创建了一个用户填写的表格,然后它使用 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]