Экспорт данных в 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')