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

Posted

技术标签:

【中文标题】如何为 DJANGO 中动态创建的 URL 设置 URL 别名?【英文标题】:How to set up URL aliases for dynamically created URLs in DJANGO? 【发布时间】:2021-05-16 19:30:09 【问题描述】:

在我的网站中,我使用主键(出于隐私/安全原因,使用 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),

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

NoReverseMatch at /reports/找不到带有参数“('e657334b-75e2-48ce-8571-211251f1b341',)' 的“报告”的反向。尝试了 1 种模式:['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"),

这允许加载以前的网站,但是当我点击链接时出现以下 404 错误:

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

我正在尝试为多个页面设置一个别名 - 实质上是用一个单词删除/替换长 uuid。

无需尝试创建别名,该网站就可以正常工作。

【问题讨论】:

您应该使用path 而不是re_path,网址不使用正则表达式 @IainShelvington 我也尝试过路径,但出现了不同的错误,我将更新问题以反映。 您需要在 url 的开头包含一个正斜杠:RedirectView.as_view(url='/reports/report/'),以便重定向是绝对的而不是相对的 @IainShelvington 谢谢,修复了 404 错误。然后我如何传递变量? pk/uuid?您是否有理由不想将其包含在 url 中?甚至不作为 GET 参数? 【参考方案1】:

如果你实在不想把报告的pk/uuid传递给缩短的url,可以在session中传递

创建一个自定义RedirectView,将pk 保存到会话中,然后在目标视图中读取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"),

【讨论】:

以上是关于如何为 DJANGO 中动态创建的 URL 设置 URL 别名?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 django 模板中的标签创建动态 id

Django CMS如何为同一个apphook的2个实例使用不同的url

如何为 Android 动态壁纸创建设置活动

在 SwiftUI 中,如何为条形图创建动态矩形?

如何为 django Q 对象动态加入多个参数

如何为用户输入文本时将动态创建的每个单元格设置按钮操作(Swift 4)?