Как изменить url в запросе django get
У меня есть веб-страница, которая отображает некоторые данные (с параметрами get для фильтрации в представлении), и я использую пагинацию.
Для перехода по данным я использую ссылку для изменения страницы в пагинаторе :
<li class="paginator-data"><a href="{{ request.get_full_path }}?page={{ page_obj.next_page_number }}">Next</a></li>
Вот вид :
@login_required
def search_and_export(request):
# initialisation
page_obj = Tree.objects.all()
# FORM
if request.method == 'GET':
## Here I get GET parameters or a default value like
data = str(request.GET.get('data', 1))
page = str(request.GET.get('page', 1))
## creating a queryDict
querydict = QueryDict('data=' data + '&page=' + page)
big_request_form = BigRequestForm(querydict)
if big_request_form.is_valid():
# Getting data from front endda
data = big_request_form.cleaned_data['data']
# Extracting QuerySet
page_obj = filtering_function(data)
paginator = Paginator(page_obj,25)
page_obj = paginator.get_page(page)
page_obj.adjusted_elided_pages = paginator.get_elided_page_range(number = page, on_each_side=1, on_ends=1)
else:
big_request_form = BigRequestForm()
# return values
context = {
'big_request_form' : big_request_form,
'page_obj' : page_obj,
}
return render(request, 'filtered_stats.html', context)
Вот проблема: url выглядит так после просмотра нескольких страниц :
http://127.0.0.1:8000/?data=x&page=2&page=3&page=4&page=5&page=6
Просмотр работает хорошо (Он показывает мне последнюю страницу), но я получил эту уродливую ссылку.
Я пробовал нечто подобное :
request.GET.get = querydict
(с querydict объект QueryDict с данными только одной страницы). Но это не сработало. Я также думал о парсинге данных в шаблоне, но возможно есть лучший способ.
В шаблоне HTML вы хотите получить текущий URL. Но на самом деле вам не нужно этого делать - вместо этого можно использовать относительный путь. Поэтому просто удалите его:
<li class="paginator-data"><a href="?page={{ page_obj.next_page_number }}">Next</a></li>
Браузер знает текущий URL и будет использовать атрибут href относительно него.
UPD.
альтернатива - для сохранения других параметров в URL можно построить "следующий URL" внутри представления и передать его в контексте как next_url.
Т.е. что-то вроде этого:
В взглядах:
next_url = request.get_full_path()
next_url.replace(f'page={current}', f'page={page_obj.next_page_number}')
context['next_url'] = next_url
В шаблоне:
<li class="paginator-data"><a href="{{ next_url }}">Next</a></li>