Django разбивка на страницы возвращает% 20 пробелов в URL - PullRequest
0 голосов
/ 19 июня 2020

Я не могу понять, почему при разбивке на страницы Django иногда к URL-адресу добавляются пробелы (%20):

https://example.com/accounts/?page=2%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&q=%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&ordering=-date_joined

Это происходит, если я нажимаю Next или определенную кнопку c страницы поэтому я предполагаю, что это связано с тем, как написано разбиение на страницы. Более конкретно, я думаю, что это связано с request.GET.items. Используют ли менеджеры контекста request.GET.items?

разбиение на страницы :

{% if page_obj.has_next %}
<a class="btn btn-default btn-inactive mb-4 m-1"
   href="?page={{ page_obj.next_page_number }}{% for key, value in request.GET.items %}
   {% if key != 'page' %}&{{ key }}={{ value }}{% endif %}{% endfor %}">Next</a>
<a class="btn btn-default btn-inactive mb-4 m-1"
   href="?page={{ page_obj.paginator.num_pages }}{% for key, value in request.GET.items %}
   {% if key != 'page' %}&{{ key }}={{ value }}{% endif %}{% endfor %}">Last</a>
{% endif %}

вид :

class AccountStatusListView(AccountSearchMixin, ListView):
    model = Employee
    template_name = 'employees/account_list.html'
    paginate_by = 15

    def get_ordering(self, *args, **kwargs):
        ordering = self.request.GET.get('ordering', '-is_active')
        return ordering

    def get_queryset(self, *args, **kwargs):
        queryset = super(AccountStatusListView, self).get_queryset()

        queryset = queryset.filter(Q(
            supervisor__exact=self.request.user)) | queryset.filter(Q(
            supervisor__isnull=False)) | queryset.filter(Q(
            is_active__exact=False))

        ordering = self.get_ordering()
        if ordering and isinstance(ordering, str):
            ordering = (ordering,)
            queryset = queryset.order_by(*ordering)

        return queryset

У кого-нибудь есть есть идеи, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вы можете передать шаблону QueryDict, например:

class AccountStatusListView(AccountSearchMixin, ListView):
    model = Employee
    template_name = 'employees/account_list.html'
    paginate_by = 15

    def get_context_data(self, *args, **kwargs):
        get_params = self.request.GET<b>.copy()</b>
        get_params<b>.pop('page', None)</b>
        return super().get_context_data(*args, **kwargs, <b>get_params=get_params</b>)

    def get_ordering(self, *args, **kwargs):
        return self.request.GET.get('ordering', '-is_active')

    def get_queryset(self, *args, **kwargs):
        queryset = super(AccountStatusListView, self).get_queryset()
        queryset = queryset.filter(Q(
            supervisor__exact=self.request.user)) | queryset.filter(Q(
            supervisor__isnull=False)) | queryset.filter(Q(
            is_active__exact=False))
        ordering = self.get_ordering()
        if ordering and isinstance(ordering, str):
            ordering = (ordering,)
            queryset = queryset.order_by(*ordering)
        return queryset

Затем в шаблоне вы можете .urlencode() [Django - doc] the get_params:

{% if page_obj.has_next %}
<a class="btn btn-default btn-inactive mb-4 m-1"
   href="?page={{ page_obj.next_page_number }}<b>&{{ get_params.urlencode }}</b>">Next</a>
<a class="btn btn-default btn-inactive mb-4 m-1"
   href="?page={{ page_obj.paginator.num_pages }}<b>&{{ get_params.urlencode }}</b>">Last</a>
{% endif %}
0 голосов
/ 20 июня 2020

У меня возникли проблемы с работой вышеуказанного ответа, поэтому я немного изменил код ... Окончательный результат выглядел так:

def get_context_data(self, *args, **kwargs):
    context = super().get_context_data(*args, **kwargs)
    get_copy = self.request.GET.copy()
    parameters = get_copy.pop('page', True) and get_copy.urlencode()
    context['params'] = parameters
    return context
{% if page_obj.has_previous %}
<a class="btn btn-default mb-4 m-1"
   href="?page=1&{{ params }}">
    First</a>
<a class="btn btn-default mb-4 m-1"
   href="?page={{ page_obj.previous_page_number }}&{{ params }}">
    Previous</a>
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...