Django - Тестирование имени представления, полученного из параметра url, т.е. ref=home
Проще говоря, я пытаюсь проверить имя представления, полученное из параметра URL, в одной из моих функций представления, чтобы убедиться, что оно действительно. Если нет, то перенаправить на другую страницу.
Например, возьмем этот url...
www.site.com/users/?ref=view_name
Тогда, на мой взгляд
ref = request.GET.get('ref', None)
return redirect(ref) if ref else redirect('users')
Проблема, конечно, в том, что если пользователь изменит параметр ref, он вернет 404. Я надеялся, что смогу проверить, является ли ref=home правильным представлением и вернуть его, если нет, то перенаправить на другое представление.
Я возился с resolve и reverse в Django, но не получил результатов, которые искал.
Я также пытался использовать try/finally во всевозможных вариантах вперемешку с resolve и reverse. Да, тупо... я знаю.
try:
if ref:
return redirect(resolve(ref))
finally:
return redirect('user')
Я искал почти два часа, пытаясь найти лаконичный способ сделать это.
Любая помощь будет оценена по достоинству!
Проблема в том, что вы передаете имя представления в resolve(), которое требует URL-путь. Чтобы защититься от 404, вам нужно сначала reverse() имя представления, чтобы получить путь. Затем вы можете использовать этот путь с помощью resolve() для проверки существования пути.
Рабочее решение На самом деле это было очень просто после подсказки @Code-Apprentice
Сначала пара импортных товаров
from django.urls.resolvers import NoReverseMatch
from django.urls import reverse
Затем, чтобы получить параметр ref и подтвердить его как законное имя представления, я сделал следующее
# get ref parameter
ref = request.GET.get('ref', None)
if ref:
try:
# redirect to ref view name if valid
return redirect(reverse(ref))
except NoReverseMatch as e:
print('No reverse match found')
# redirect to specific view if ref is invalid
return redirect('users')