Django:带有动态URL的侧边栏:如何动态创建路径中有动态文件夹的URL



我在Django的侧边栏导航中遇到了动态URL的问题,我希望你们中的一些人能帮助我了解如何解决这个问题。我一直在寻找类似的问题,但我找不到我的问题的答案。

基本上,我想要实现的是有一个带有链接的侧边栏。这个侧边栏将在许多页面上重复使用,因此它位于一个单独的sidebar.py文件中,该文件稍后将导入到页面中。

<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted">
<span>Content</span>
<a class="d-flex align-items-center text-muted" href="#">
<span data-feather="plus-circle"></span>
</a>
</h6>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link active" href="DYNAMIC LINK HERE">
<span data-feather="home"></span>
Status codes</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">
<span data-feather="file"></span>
Depth
</a>
</li>              
</ul>

我想显示的链接如下:

urls.py

path('<id>/<crawl_id>/dashboard/', ProjectDashboard, name="crawl_dashboard"),
path('<id>/<crawl_id>/dashboard/status-codes/', StatusCodeDashboard, name="status_code_dashboard"),
path('<id>/<crawl_id>/dashboard/url-depth/', UrlDepthDashboard, name="url_depth_dashboard"),

正如您所看到的,它们是动态URL,采用id和crawl_id。因此,对于每个爬网面板,我希望侧边栏链接到其相对的status_code_dashboard页面和url_depth_dashboard页。

例如:

/22/123/dashboard --> should have a sidebar with links to:
/22/123/dashboard/status-code/
/22/123/dashboard/url-depth/

我试图做的是创建一个上下文处理器,如下所示:

def get_dashboard_paths(request):
# Get current path
current_path = request.get_full_path()
depths_dashboard = current_path + 'url-depth/'
return {
'depths_dashboard': depths_dashboard

}

然后在sidebar.py模板中使用{{depths_dashboard}}。。。

这很有效,但不可扩展:例如,当我在/22/123/dashboard/status-code/中时,我仍然希望有侧边栏链接到其他部分。如果我使用上面的上下文处理器,由于解决方案不好,错误的链接会被创建为:

/22/123/dashboard/status-code/status-code/
/22/123/dashboard/status-code/url-depth/

你有关于我如何在上面所有页面上显示侧边栏的提示吗?侧边栏具有基于id和crawl_id的动态URL?基本上,问题是,如何根据我所在的id和crawl_id上下文动态地正确发送这些参数?

非常感谢!

只需将idcrawl_id传递到模板中。然后在模板中:

<a href="/{{ id }}/{{ crawl_id }}/dashboard">Dashboard</a>
<a href="/{{ id }}/{{ crawl_id }}/dashboard/status-code">Status code</a>
<a href="/{{ id }}/{{ crawl_id }}/dashboard/url-depth">URL depth</a>

如果您特别想使用预处理器,也可以从get_full_path().split('/')中获取这些数字。

最新更新