RedirectView supporting View-Names

113 views
Skip to first unread message

Ludwig Kraatz

unread,
Nov 23, 2012, 7:30:25 AM11/23/12
to django-d...@googlegroups.com
Hi,

is there a specific reason why the RedirectView does not have a "view_name" attribute and out-of-the-box supporting to reverse it? 

  if self.url:
     url = self.url
  elif self.view_name:
     url = reverse(self.view_name, kwargs=kwargs, request=request)
  else:
     return None

best regards
ludwig

Simon Meers

unread,
Nov 23, 2012, 3:03:19 PM11/23/12
to django-developers
See https://code.djangoproject.com/ticket/15273


ludwig

--
You received this message because you are subscribed to the Google Groups "Django developers" group.
To view this discussion on the web visit https://groups.google.com/d/msg/django-developers/-/YaZrSyhb7fEJ.
To post to this group, send email to django-d...@googlegroups.com.
To unsubscribe from this group, send email to django-develop...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.

Ludwig Kraatz

unread,
Nov 25, 2012, 6:02:51 AM11/25/12
to django-d...@googlegroups.com
Well, ... I know about reverse_lazy

Sorry for not explaining myself good enough:

reverse_lazy can't do:
url( 'bar/foo/(?P<pk>[0-9]*)/', RedirectView( url= reverse_lazy('foo_stuff') ),
url( 'foo/(?P<pk>[0-9]*)/', some_view_func, name = 'foo_stuff' ), 

What a RedirectView supporting URL Names (...) could do: 
url( 'bar/foo/(?P<pk>[0-9]*)/', RedirectView( view_name = 'foo_stuff' ),
url( 'foo/(?P<pk>[0-9]*)/', some_view_func, name = 'foo_stuff' ), 

I'm handling it as a view-name instead of url name, because in my opinion, a view in -some specific URL-Context- always has a name that can be chosen, that even if the URL changes in some detail, it would remain the same:
* posts_by_specific_user * or something like that - if it is located in '/user/<user-pk>/posts/' or '/department/<who-cares-we-have-the-global-user-pk>/users/<user-pk>/posts/' 
An URL... well i wouldn't know why to name a URL - a URL is more or less something like a name / identifier. Just not this intuitive understandable or in some cases  longtime-persistent. Changing a URL would somehow result in changing the url-name (because otherwise the name would result form something else than the URL itself) - and thats just a real pity because something that does the same would be named differently.

Benefit for using it like this: 
  • Caused by whatever decisions (this shouldn't happen but most likely always will..) the url of a specific VIEW changes, one can now support the legacy URL because other sites might have linked to it and 301 (Moved Permanently) Redirect it to the new URL, specified by the view name.
  • Or in some other case for APIs when representing a Resource: when having the same resource at two different URLs, one can easily 302 redirect it to one *base* view (once again, the URL might change. especially when using versioned URLs)
 
What would needed to be changed in RedirectView:

By having something like this in the get() method:
get_redirect_url(request, args=args kwargs=kwargs)
 
and in get_redirect_url:
elif self.view_name:
url = reverse( self.view_name, args=args, kwargs=kwargs)
one could dynamically pass those url args and kwargs, of a dynamic url


i don't understand why such a basic concept like named urls/views are somehow integrated in django (template tag: url) but in this case just accessible through nasty workarounds (reverse_lazy). In my opinion a workaround like this often just points out, that something is probably unfinished. And in my opinion this is definitely the case when looking at RedirectView and those .. view-names .. because some important functionality is not available.

So - i would really appreciate having this functionality (as far as i don't miss anything you guys thought about, that speaks against it).


best regards
ludwig
Reply all
Reply to author
Forward
0 new messages