如何在 DJANGO 中为动态创建的 URL 设置 URL 别名?

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

在我的站点中,我有使用主键(出于 privacy/security 原因使用 uuid.uuid4())作为 URL 即时创建的页面。我最终得到 .../reports/e657334b-75e2-48ce-8571-211251f1b341/ 有没有办法为所有这些动态创建的站点创建别名,例如 .../reports/report/.

现在我的 urls.py 包括以下内容:

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

我尝试将其更改为:

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

但是我访问了包含 link 长 URL 的站点,我收到以下错误:

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

该站点的模板包括:

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

我还尝试了以下网址:

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

允许加载以前的站点,但是当我单击 link 时出现以下 404 错误:

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

我正在尝试为多个页面设置一个别名 - 本质上是 removing/replacing 一个单词的长 uuid。

在不尝试创建别名的情况下,网站运行良好。

如果你真的不想将报告的pk/uuid传递给缩短的url,你可以在会话

中传递它

创建自定义 RedirectViewpk 保存到会话中,然后在目标视图中读取 pk

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']
    ...

您使用自定义 RedirectView 就像使用内置

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