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')
Вернуться на верх