Die Übergabe von url='/permalink/(?P<id>\d+)/'
an funktioniert nicht, da die Ansicht die benannten Argumente in der URL nicht ersetzt.
Mit können Sie jedoch die pattern_name
anstelle der url
zur Weiterleitung an. Die URL wird mit denselben Argumenten und Kwargs umgekehrt, die für die ursprüngliche Ansicht übergeben wurden.
Dies funktioniert in Ihrem Fall, weil beide URL-Muster ein benanntes Argument haben, id
.
urlpatterns = [
url(r'^permalink/(?P<id>\d+)/foo/$',
RedirectView.as_view(pattern_name="target_view"),
name="original_view"),
url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
]
Wenn das Ziel URL-Muster andere Argumente verwendet, dann können Sie nicht url
oder pattern_name
verwenden. Stattdessen können Sie die Unterklasse und überschreiben get_redirect_url
.
from django.core.urlresolvers import reverse
from django.views.generic import RedirectView
class QuerystringRedirect(RedirectView):
"""
Used to redirect to remove GET parameters from url
e.g. /permalink/?id=10 to /permalink/10/
"""
def get_redirect_url(self):
if 'id' in self.request.GET:
return reverse('target_view', args=(self.request.GET['id'],))
else:
raise Http404()
Es wäre eine gute Übung QuerystringRedirect
in Ihre Ansichten Modul zu setzen. Sie würden dann die Ansicht zu Ihren URL-Mustern mit etwas wie hinzufügen:
urlpatterns = [
url(r'^permalink/$', views.QuerystringRedirect.as_view(), name="original_view"),
url(r'^permalink/(?P<id>\d+)/$', views.permalink, name="target_view"),
]