【发布时间】:2021-02-15 05:12:28
【问题描述】:
制作了一个从模型中提取数据的视图。根据这些数据,填充模板中的表格。为表(模型)的每个字段添加了基于 django-filters 的过滤。面临以下问题,我需要将过滤后的数据保存到excel中。问题正是在获取过滤后的数据时,保存在excel中是没有问题的。
我的基于班级的观点:
class RequestList(FilterView):
template_name = 'MQueryboard/Requests/RequestList.html'
filterset_class = Filter_Adjustments_view
model = Adjustments
paginate_by = 3
def get_queryset(self):
filterset_class = Adjustments.objects.order_by('-dateadjustment')
return filterset_class
def get_context_data(self, *args, **kwargs):
_request_copy = self.request.GET.copy()
parameters = _request_copy.pop('page', True) and
_request_copy.urlencode()
context = super().get_context_data(*args, **kwargs)
context['parameters'] = parameters
return context
def post(self, request):
if request.method == 'POST':
response = adjustments_to_excel(Adjustments.objects.all())
return response
else:
return render(request, 'MQueryboard/Requests/RequestList.html', {})
adjusts_to_excel 函数 - 为了不加载视图,数据被发送到脚本以生成 Excel 文件。
这里我不明白如何在 post 函数中获取过滤后的查询集。现在,作为“存根”是模型所有字段的选择。
请告诉我如何做到这一点。我已经为这个问题苦苦挣扎了一个星期,还没有解决任何问题。
提前致谢!
更新:
过滤器类
class Filter_Adjustments_view(django_filters.FilterSet):
dateadjustment = django_filters.DateFilter(field_name='dateadjustment', lookup_expr='lte', widget= DateInput(
attrs={'type': 'date', }))
memodescription = django_filters.CharFilter(field_name='memodescription', lookup_expr='icontains')
memonumber = django_filters.CharFilter(field_name='memonumber', lookup_expr='icontains')
memodate = django_filters.DateFilter(field_name='memodate', lookup_expr='lte', widget= DateInput(
attrs={'type': 'date', }))
class Meta:
model = Adjustments
fields = ['dateadjustment', 'department', 'typeadjustment', 'memodescription', 'memonumber', 'memodate', 'creationuser']
更新 2:
html template
{% block content %}
<div class="main-content-data-no-grid">
{% if user.is_authenticated %}
{% for group in user.groups.all %}
{% if group.name == 'Admin_group' %}
<a class="btn btn-dark mb-2" href="{% url 'Request add' %}">Добавить новую заявку</a>
<a class="btn btn-dark mb-2" href="{% url 'Requests department list' %}">Подразделения</a>
<a class="btn btn-dark mb-2" href="{% url 'Requests type adjustment list' %}">Виды корректировок</a>
{% endif %}
{% endfor %}
<table class="table table-dark table-bordered table table-hover">
<thead>
<tr class="text-center">
<th scope="col">#</th>
<th scope="col">Подразделение</th>
<th scope="col">Дата</th>
<th scope="col">Дата СЗ</th>
<th scope="col">Номер СЗ</th>
<th scope="col">Вид корректировки</th>
<th scope="col">Описание корректировки</th>
<th scope="col">Пользователь</th>
</tr>
</thead>
<form method="get">
<thead>
<th scope="col">#</th>
<th scope="col">{{ filter.form.department }}</th>
<th scope="col">{{ filter.form.dateadjustment }}</th>
<th scope="col">{{ filter.form.memodate }}</th>
<th scope="col">{{ filter.form.memonumber }}</th>
<th scope="col">{{ filter.form.typeadjustment }}</th>
<th scope="col">{{ filter.form.memodescription }}</th>
<th scope="col">{{ filter.form.creationuser }}</th>
</thead>
<button type="submit" class="btn btn-success mb-2">Фильтровать</button>
</form>
<tbody>
{% for field in object_list %}
<tr onclick="document.location = '{% url 'Request detail' pk=field.pk %}'">
<td scope="row">{{ forloop.counter }}</td>
<td>{{ field.department }}</td>
<td>{{ field.dateadjustment }}</td>
<td>{{ field.memodate }}</td>
<td>{{ field.memonumber }}</td>
<td>{{ field.typeadjustment }}</td>
<td>{{ field.memodescription }}</td>
<td>{{ field.creationuser }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div>
<form method="POST" action="{% url 'Requests list' %}">
{% csrf_token %}
<div>
<button class="btn btn-danger mb-2" type="submit" name="toExcel">To excel</button>
</div>
</form>
</div>
<div class="main-content-data-no-grid">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1&{{ parameters }}">« В начало</a>
<a href="?page={{ page_obj.previous_page_number }}&{{ parameters }}">Назад</a>
{% endif %}
<span class="current">
Страница {{ page_obj.number }} из {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}&{{ parameters }}">Вперед</a>
<a href="?page={{ page_obj.paginator.num_pages }}&{{ parameters }}">В конец »</a>
{% endif %}
</span>
</div>
{% endif %}
{% endblock %}
【问题讨论】:
-
不清楚是什么问题。你能清楚地描述你到底想要什么吗?
-
我不明白如何才能将过滤后的数据保存到excel中。
-
是的,我正在从模型中获取所有数据。而我只需要在界面中获取过滤后的数据即可。
-
@AlexandrSkorohodov 您应该编辑您的问题以添加澄清而不是其他答案。您可以在问题下方找到编辑按钮,也可以使用此链接 edit。
-
@AlexandrSkorohodov 您的过滤器甚至没有出现在您的方法发布表单中......当然这些参数不会被发布。要么将表单字段添加到表单的 post 方法,要么编写一些 JavaScript 在提交时将字段添加到表单。或者,如果您可以接受具有保存某些内容的副作用的 GET 请求,则将您的
adjustments_to_excel放入 get 请求中。
标签: python django django-queryset django-filters