Заполнение данных из базы данных в 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/')

sample_template.docx enter image description here

Вернуться на верх