如何为 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 别名?的主要内容,如果未能解决你的问题,请参考以下文章