Search code examples
pythondjangodjango-viewsdjango-urlsdjango-url-reverse

Django - Testing a view name retrieved from a url parameter ie. ref=home


Simply put, I am trying to test a view name, captured from a URL parameter, within one of my view functions to see if it is valid. If not, to redirect to another page.

For example, take this url...

www.site.com/users/?ref=view_name

Then in my view

    ref = request.GET.get('ref', None)
    return redirect(ref) if ref else redirect('users')

The problem is, of course, that if a user alters the ref parameter, it will kick back a 404. I was hoping to be able to test if ref=home is a valid view and return it, if not then redirect to another view.

I have been messing with Django's resolve and reverse but I am not getting the results I was looking for.

I also tried to use a try/finally in all sorts of ways mixed in with resolve and reverse. Yeah, dumb...I know.

try:
     if ref:
          return redirect(resolve(ref))
finally:        
     return redirect('user')

I have searched for almost two hours to try to fund a succinct way to do this.

Any help would be appreciated!


Solution

  • Working Solution This was actually very simple after guidance from @Code-Apprentice

    A couple Imports first off

    from django.urls.resolvers import NoReverseMatch
    from django.urls import reverse
    

    Then to get the ref parameter and validate is as a legit view name I did the following

    # 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')