Заполнение данных из базы данных в Word (Django Python)
Я не знаю, как получить данные и заполнить ими мой шаблон word. На самом деле это длинный список, и мне нужно заполнить его в моей таблице в документе word. Правильно ли я делаю? Вот мой код:
def save_sample_details(request):
sample = SampleList.objects.all()
doc = DocxTemplate("lab_management/word/sample_template.docx")
context = {
'SNAME' : sample.sample_name,
'STYPE' : sample.sample_type,
'HVER' : sample.hardware_version,
'SVER' : sample.software_version,
'CS' : sample.config_status,
'NUM' : sample.number,
'SNUM' : sample.sample_number,
}
doc.render(context)
doc.save('lab_management/word/sample.docx')
return redirect('/lab/sample/details/')
Если я запускаю эту программу, она показывает Объект "QuerySet" не имеет атрибута 'sample_name' и т.д.
Вы получаете все SampleList
объекты, когда вызываете SampleList.objects.all()
, поэтому возвращается QuerySet
из нуля или более объектов, а не один объект - что вам и нужно.
Вместо этого вы должны получить единственный нужный вам объект SampleList
: например sample = SampleList.objects.get(id=1)
или другой пример - чтобы получить первый объект в QuerySet
, вы можете сделать sample = SampleList.objects.all()[0]
(но если QuerySet
будет пустым, вы получите ошибку индекса). Вы не указали, как вы хотите определить, какой SampleList поместить в Word doc, но вы можете указать любые фильтры в свойствах .get()
.
В Django есть довольно хорошая документация по кверисетам: https://docs.djangoproject.com/en/4.1/ref/models/querysets/
Измените свой код следующим образом:
def save_sample_details(request):
sample_list = SampleList.objects.all()
doc = DocxTemplate("lab_management/word/sample_template.docx")
context_list = []
for sample in sample_list:
context = {
'SNAME' : sample.sample_name,
'STYPE' : sample.sample_type,
'HVER' : sample.hardware_version,
'SVER' : sample.software_version,
'CS' : sample.config_status,
'NUM' : sample.number,
'SNUM' : sample.sample_number,
}
context_list.append(context)
doc.render(context_list)
doc.save('lab_management/word/sample.docx')
return redirect('/lab/sample/details/')
Вы должны выполнять итерацию в context_list
также в документе
(Предполагается, что вы используете библиотеку docxtpl
)
Я ответил на свой вопрос. Спасибо за помощь!
views.py
def save_sample_details(request):
sample = SampleList.objects.all()[0:15]
template = DocxTemplate("lab_management/word/sample_template.docx")
context = {
'headers' : ['SNAME', 'STYPE', 'HVER', 'SVER', 'CS', 'NUM', 'SNUM'],
'list': [],
}
alist = ['a']
for i in alist:
for samples in sample:
content= [samples.sample_name, samples.sample_type, samples.hardware_version,
samples.software_version, samples.config_status, samples.number,
samples.sample_number ]
context['list'].append(content)
template.render(context)
template.save('lab_management/word/sample.docx')
return redirect('/lab/sample/details/')