goalie1998
goalie1998

Reputation: 1432

How to set up URL aliases for dynamically created URLs in DJANGO?

In my site, I have pages that are created on the fly using primary keys (for privacy/security reasons using uuid.uuid4()) as the URLs. I end up with .../reports/e657334b-75e2-48ce-8571-211251f1b341/ Is there a way to make aliases for all of these dynamically created sites to something like .../reports/report/.

Right now my urls.py includes the following:

path("reports/<str:pk>/", views.report_detail, name="report")

I tried changing it to:

re_path('reports/<str:pk>/', RedirectView.as_view(url='/reports/report/'), name="report"),
path("reports/report/", views.report_detail),

But I go to the site that has the links to the long URLs, I get the following error:

NoReverseMatch at /reports/
Reverse for 'report' with arguments '('e657334b-75e2-48ce-8571-211251f1b341',)' not found. 1 pattern(s) tried: ['reports/str:pk/']

The template for that site includes:

<a class="card-title" href="{% url 'report' report.pk%}">

I also tried the following for urls:

path("reports/report/", views.report_detail),
path('reports/<str:pk>/', RedirectView.as_view(url='reports/report/'), name="report"),

Which allowed the previous site to load, but when I clicked on the link got the following 404 error:

Request URL:    http://127.0.0.1:8000/reports/e657334b-75e2-48ce-8571-211251f1b341/reports/report/

I am trying to have one alias for multiple pages - essentially removing/replacing the long uuid with a single word.

Without trying to make an alias, the site works fine.

Upvotes: 2

Views: 775

Answers (1)

Iain Shelvington
Iain Shelvington

Reputation: 32244

If you really don't want to pass the pk/uuid of the report to the shortened url, you could pass it in the session

Create a custom RedirectView that saves the pk to the session and then read that pk in the target view

class ReportRedirect(RedirectView):

    def get(self, request, pk):
        request.session['report_pk'] = pk
        return super().get(request, pk)


def report_detail(request):
    report_pk = request.session['report_pk']
    ...

You use the custom RedirectView just like the built-in one

path("reports/report/", views.report_detail),
path('reports/<str:pk>/', views.ReportRedirect.as_view(url='/reports/report/'), name="report"),

Upvotes: 3

Related Questions