【问题标题】:How to save filtered data in excel in Django?如何在 Django 的 excel 中保存过滤后的数据?
【发布时间】: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 }}">&laquo; В начало</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 }}">В конец &raquo;</a>
                    {% endif %}
                </span>
            </div>



        {% endif %}
{% endblock %}

【问题讨论】:

  • 不清楚是什么问题。你能清楚地描述你到底想要什么吗?
  • 我不明白如何才能将过滤后的数据保存到excel中。
  • 是的,我正在从模型中获取所有数据。而我只需要在界面中获取过滤后的数据即可。
  • @AlexandrSkorohodov 您应该编辑您的问题以添加澄清而不是其他答案。您可以在问题下方找到编辑按钮,也可以使用此链接 edit
  • @AlexandrSkorohodov 您的过滤器甚至没有出现在您的方法发布表单中......当然这些参数不会被发布。要么将表单字段添加到表单的 post 方法,要么编写一些 JavaScript 在提交时将字段添加到表单。或者,如果您可以接受具有保存某些内容的副作用的 GET 请求,则将您的 adjustments_to_excel 放入 get 请求中。

标签: python django django-queryset django-filters


【解决方案1】:

问题是FilterView 不处理 POST 请求。您需要自己调用适当的方法来过滤响应。试试这个:

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 get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if self.request.method == "POST":
            kwargs['data'] = self.request.POST
        return kwargs

    def post(self, request):
        # since you are implementing the post method it would always be a post request!
        filterset_class = self.get_filterset_class()
        self.filterset = self.get_filterset(filterset_class)

        if not self.filterset.is_bound or self.filterset.is_valid() or not self.get_strict():
            self.object_list = self.filterset.qs
        else:
            self.object_list = self.filterset.queryset.none()
        response = adjustments_to_excel(self.object_list)
        return response

基本上,我们从FilterView 复制了大部分get 方法的实现。 get_filterset_kwargs 也使用 request.GET 所以在 POST 的情况下,我们正在更新它正确设置的数据。我在这里假设你的函数 adjustments_to_excel 返回一个有效的响应。

【讨论】:

  • 我试着按照你写的去做。不幸的是,我仍然得到所有数据,不包括过滤器。
  • 我在发布后稍微编辑了答案,确保您检查正确。特别是我忘记从get_filterset_kwargs返回,也没有通过self.object_listadjustments_to_excel
  • 我尝试了最后一个选项,不幸的是它不起作用。返回所有数据。
  • 你能在if not self.filterset.is_bound ...之前打印self.filterset.is_bound的值是多少?也尝试打印self.request.POST
  • self.filterset.is_bound return = True.
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多