Django - 测试从 url 参数检索的视图名称,即。参考=家

Django - Testing a view name retrieved from a url parameter ie. 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 是否是有效视图并且 return 它,如果没有则重定向到另一个视图。

我一直在搞乱 Django 的 resolve 和 reverse 但我没有得到我想要的结果。

我还尝试以各种方式将 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')