Skip to content

Commit 114c085

Browse files
committed
feat(navbar): 新增面包屑组件并优化导航栏
- 提取面包屑渲染逻辑为独立模板组件 `breadcrumbs_items.html` - 新增 `render_breadcrumbs` 模板标签,支持在导航栏中单独使用面包屑 - 重构 `page_header` 标签,将面包屑处理逻辑提取为 `_normalize_breadcrumbs` 函数 - 优化导航栏模板,支持传入 `breadcrumbs` 上下文变量时自动渲染面包屑导航 - 移除文档链接的 `target="_blank"` 属性以改善用户体验
1 parent 54617e3 commit 114c085

4 files changed

Lines changed: 52 additions & 21 deletions

File tree

src/apps/home/templates/home/dashboard.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ <h3 class="card-title text-base font-bold mb-4">
154154
</h3>
155155
<div class="grid grid-cols-2 gap-3">
156156
<!-- Docs -->
157-
<a href="{% url 'djs_docs:index' %}" target="_blank" class="card card-compact bg-base-200 hover:bg-base-300 transition-colors border border-base-300">
157+
<a href="{% url 'djs_docs:index' %}" class="card card-compact bg-base-200 hover:bg-base-300 transition-colors border border-base-300">
158158
<div class="card-body items-center text-center py-4">
159159
<i class="fa-solid fa-file-lines text-2xl text-info mb-1"></i>
160160
<h4 class="card-title text-xs font-medium">Docs</h4>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{% for item in breadcrumbs %}
2+
<li>
3+
{% if item.url and not forloop.last %}
4+
<a href="{{ item.url }}" class="hover:text-primary transition-colors flex items-center gap-2">
5+
{% if item.icon %}<i class="{{ item.icon }}"></i>{% endif %}
6+
{{ item.text }}
7+
</a>
8+
{% else %}
9+
<span class="text-base-content font-semibold flex items-center gap-2">
10+
{% if item.icon %}<i class="{{ item.icon }}"></i>{% endif %}
11+
{{ item.text }}
12+
</span>
13+
{% endif %}
14+
</li>
15+
{% endfor %}

src/django_starter/contrib/navbar/templatetags/page_tags.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,22 @@
33

44
register = template.Library()
55

6+
def _normalize_breadcrumbs(breadcrumbs):
7+
if breadcrumbs is None:
8+
return []
9+
10+
processed_breadcrumbs = []
11+
for item in breadcrumbs:
12+
if isinstance(item, (list, tuple)) and len(item) >= 2:
13+
processed_breadcrumbs.append({
14+
'text': item[0],
15+
'url': item[1],
16+
'icon': None
17+
})
18+
else:
19+
processed_breadcrumbs.append(item)
20+
return processed_breadcrumbs
21+
622
@register.inclusion_tag('django_starter/components/page_header.html')
723
def page_header(title, breadcrumbs=None):
824
"""
@@ -18,22 +34,17 @@ def page_header(title, breadcrumbs=None):
1834
1935
icon参数可选,如不提供则不显示图标
2036
"""
21-
if breadcrumbs is None:
22-
breadcrumbs = []
23-
24-
# 兼容旧格式 [(name, url), ...]
25-
processed_breadcrumbs = []
26-
for item in breadcrumbs:
27-
if isinstance(item, (list, tuple)) and len(item) >= 2:
28-
processed_breadcrumbs.append({
29-
'text': item[0],
30-
'url': item[1],
31-
'icon': None
32-
})
33-
else:
34-
processed_breadcrumbs.append(item)
35-
3637
return {
3738
'title': title,
38-
'breadcrumbs': processed_breadcrumbs,
39+
'breadcrumbs': _normalize_breadcrumbs(breadcrumbs),
40+
}
41+
42+
@register.inclusion_tag('django_starter/components/breadcrumbs_items.html')
43+
def render_breadcrumbs(breadcrumbs):
44+
"""
45+
仅渲染面包屑导航列表项 (<li>...</li>)
46+
用于 navbar 等需要单独显示面包屑的地方
47+
"""
48+
return {
49+
'breadcrumbs': _normalize_breadcrumbs(breadcrumbs),
3950
}

src/templates/_components/navbar.html

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
{% load i18n %}
1+
{% load i18n page_tags %}
2+
23
<!--
34
Modern Minimalist Navbar (Apple/Glassmorphism Style)
45
- High backdrop blur for depth
@@ -32,9 +33,13 @@
3233
<div class="hidden md:flex flex-col justify-center ml-2 transition-opacity duration-300">
3334
<div class="text-sm breadcrumbs p-0 text-base-content/60 font-medium">
3435
<ul>
35-
<li><a href="/" class="hover:text-primary transition-colors">App</a></li>
36-
{% if title %}
37-
<li class="text-base-content font-semibold">{{ title }}</li>
36+
{% if breadcrumbs %}
37+
{% render_breadcrumbs breadcrumbs %}
38+
{% else %}
39+
<li><a href="/" class="hover:text-primary transition-colors">App</a></li>
40+
{% if title %}
41+
<li class="text-base-content font-semibold">{{ title }}</li>
42+
{% endif %}
3843
{% endif %}
3944
</ul>
4045
</div>

0 commit comments

Comments
 (0)