Экспорт данных в excel из представления на основе класса

У меня есть представление, основанное на классе, и когда запрос отправляется, self.readdb() передает результат словаря в переменную self.db_result, которая заполняется как html таблица. Это работает нормально.

Мне нужно экспортировать эту таблицу в excel.

Мой view.py

  class Download(View):
    def __init__(self, logger=None, **kwargs):
        self.logger = logging.getLogger(__name__)
        self.db_result = []

  def post(self, request):
    if request.method == 'POST':
        form = DownloadForm(request.POST, request.FILES)
        if form.is_valid():  
            self.db_result = self.readdb() 
            if self.db_result != False:
                return render(request,'download.html',{'present': self.db_result[0]})
        <table class="presenttb">
            <caption>Present in DB</caption>
            <tbody>
                {% for key, value in present.items %}
                    <tr>
                        <td> {{ key }} </td> <td> {{ value }} </td>
                    </tr>
                {% endfor %}
            </tbody>
            <a href="{% url 'export_excel' %}">Download excel file</a>
        </table>
    {% endif %}

Я попробовал следующее, что генерирует файл excel при нажатии, но в нем нет данных. print(self.db_result) в функции get печатает []. Похоже, что результат из "post" недоступен в "get".

    def get(self, request):
       if request.method == 'GET':    
            if request.path_info == '/export/excel':
                print(self.db_result)
                response = self.export_users_xls()
                return response

    def export_users_xls(self):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachement; filename="report.csv"'
        print(self.db_result)
        writer = csv.writer(response)
        writer.writerow(['Command', 'XML data'])

        return response

Как я могу получить доступ к self.db_result из функции "post" в "get", чтобы я мог сгенерировать файл excel. Если я делаю что-то не так, пожалуйста, направьте меня на правильные шаги. Я не использую Models. self.db_result из post имеет требуемый результат, который должен быть заполнен как excel.

Вы не можете как таковой. Действие GET и действие POST являются отдельными типами запросов - один загружает страницу и, возможно, отправляет пары имя/значение из формы через URL, а другой размещает эти пары за сценой. Переменная, созданная в одной функции, не сразу становится доступной в другой, потому что они выполняются как разные запросы/загрузки страницы.

Если вам нужно обратиться к предыдущей переменной, вы можете сохранить ее как переменную сессии (см. docs для более подробной информации)

eg в вашем посте()

    if form.is_valid():  
        self.db_result = self.readdb() 
        request.session['db_result'] = self.db_result

и затем позже, в вашей get()

   #use session.get() to return None if variable has not been set.
   self.db_result = request.session.get('db_result')
   
Вернуться на верх