Django как переслать django -фильтр URL именованных параметров - PullRequest
0 голосов
/ 19 марта 2020

Я новичок в django, поэтому я мог бы задавать глупый вопрос, но как мне перенаправить именованный параметр URL A в URL B?

Например:

URL A = https://stackoverflow.com/questions?parameter=1
URL B = https://stackoverflow.com/ask

То, что я на самом деле хочу, это:

URL B = https://stackoverflow.com/ask?parameter=1

Мне нужно сделать это, потому что мне нужно передать эти параметры представлению, которое вызывается во втором URL, может ли кто-нибудь мне помочь?

EDIT1 Представления, которые находятся в игре, следующие:

class HostServiceListView(BaseFilterView, ListView):
    template_name = 'services/service_list.html'
    model = HostService
    paginate_by = 15
    context_object_name = 'services'
    filterset_class = HostServiceFilterSet

def exportHostServices(request):
    hsqs = HostService.objects.filter(hostname__icontains=request.GET.get("hostname_input", ''),\
                                        ip__icontains=request.GET.get("ip_input", ''),\
                                        port__icontains=request.GET.get("port_input", ''),\
                                        servicename__icontains=request.GET.get("servicename_input", ''))

    df = read_frame(hsqs)

    # my "Excel" file, which is an in-memory output file (buffer)
    # for the new workbook
    excel_file = IO()

    # pylint shows a false positive error here,
    # so the alert is suppressed with the comment after the code
    xlwriter = pd.ExcelWriter(excel_file, engine='xlsxwriter') # pylint: disable=abstract-class-instantiated

    df.to_excel(xlwriter, 'Host Services')

    xlwriter.save()
    xlwriter.close()

    # rewind the buffer
    excel_file.seek(0)

    # set the mime type so that the browser knows what to do with the file
    response = HttpResponse(excel_file.read(),\
        content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')

    # set the file name in the Content-Disposition header
    response['Content-Disposition'] = 'attachment; filename=Anagrafica-Servizi.xlsx'

    return response

urls.py настроен следующим образом:

urlpatterns = [
    path('services/', HostServiceListView.as_view(), name='services'),
    path('services/exportHostServices/', exportHostServices, name='exportHostServices'),
    path('', IndexFilterView, name="index")
]

Наконец, у меня есть кнопка html, которая должна вызывать exportHostServices со строкой запроса, чтобы я мог получить параметры:

services / service_list. html

{% extends 'services/base.html' %}

{% load paginatedfilter %}

{% block title %}Host Services{% endblock title %}

{% block content %}

    <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
        <h1 class="h2">Service Registry</h1>
        <div class="btn-toolbar mb-2 mb-md-0">
            <div class="btn-group mr-2">
                <form action="{% url 'exportHostServices' %}?{{ request.GET.urlencode }}">
                    <input type="submit" class="btn btn-sm btn-outline-secondary" value="Export">
                </form>
            </div>
        </div>
    </div>

    <div class="table-responsive table-sm">

    <form method="GET">

        <input type="submit" class="btn-hidden"/>

        <table class="table table-hover table-light table-striped">
            <thead class="thead-light">
                <tr>
                    <th>{{ filter.form.hostname_input }}</th>
                    <th>{{ filter.form.ip_input }}</th>
                    <th>{{ filter.form.port_input }}</th>
                    <th>{{ filter.form.servicename_input }}</th>
                </tr>
            </thead>
            <tbody>
                {% for service in  services %}
                <tr>
                    <td>{{ service.hostname }}</td>
                    <td>{{ service.ip }}</td>
                    <td>{{ service.port }}</td>
                    <td>{{ service.servicename }}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>

        {% if is_paginated %}
            <ul class="pagination">
                {% if page_obj.has_previous %}
                    <li class="page-item">
                        <a class="page-link" href="?{% param_replace page=page_obj.previous_page_number %}" aria-label="previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                {% endif %}
                {% for i in paginator.page_range %}
                    {% if page_obj.number == i %}
                        <li class="page-item active" aria-current="page">
                            <span class="page-link">
                                {{ i }}
                                <span class="sr-only">(current)</span>
                            </span>
                        </li>
                    {% else %}
                        <li class="page-item">
                            <a class="page-link" href="?{% param_replace page=i %}">{{ i }}</a>
                        </li>
                    {% endif %}
                {% endfor %}
                {% if page_obj.has_next %}
                    <li class="page-item">
                        <a class="page-link" href="?{% param_replace page=page_obj.next_page_number %}" aria-label="next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
                {% endif %}
            </ul>
        {% endif %}
    </form>
</div>

{% endblock content %}

1 Ответ

0 голосов
/ 20 марта 2020

Выяснили, наконец, что не так с кодом. Проблема заключалась в том, что форма, в которой я передал строку запроса, была по умолчанию настроена на GET:

<form action="{% url 'exportHostServices' %}?{{ request.GET.urlencode }}">

Исправлено было просто преобразовать ее в форму POST, чтобы строка запроса могла быть передана в представление:

<form action="{% url 'exportHostServices' %}?{{ request.GET.urlencode }}" method="post">
...