【发布时间】: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 参数?
标签: python python-3.x django django-urls