第一章:缘起——为啥我的分类列表像个“铁憨憨”?
相信很多Django初学者都经历过这样的阶段:跟着教程吭哧吭哧地写好了模型(Model),搞定了视图(View),然后在模板(Template)里,用类似下面这样的代码渲染分类:
<ul>
{% for category in categories %}
<li><a href="{% url 'category' category.id %}">{
{ category.name }}</a></li>
{% endfor %}
</ul>
搞定,收工!然后一看浏览器……嗯,功能是有了,但这玩意儿长得也太“原生态”了吧?光秃秃一个列表,毫无美感可言,放在博客侧边栏就像个没人疼的“铁憨憨”。
你可能会想:“我给它加个Bootstrap的 list-group 类不就完事儿了?”
<ul class="list-group">
{% for category in categories %}
<li class="list-group-item"><a href="...">{
{ category.name }}</a></li>
{% endfor %}
</ul>
看起来是好了点,但它依然“死气沉沉”。我们想要的是什么呢?
- 带文章计数:每个分类后面跟着一个数字,显示该分类下有多少篇文章,瞬间凸显专业性。
- 高亮当前分类:当我浏览“Python”分类下的文章时,“Python”这个分类项应该被高亮显示,给用户清晰的导航反馈。
- 可折叠/展开:如果分类太多,能不能做个折叠面板,不占地方?
- 复用性:这个组件应该在博客的多个页面(首页、文章详情页、关于我等)都能使用,而不是把同样的代码到处复制粘贴。
看,需求就是这么一步步“得寸进尺”的。而满足这些需求的过程,就是我们从“写死代码”到“打造组件”的进化之路。
第二章:筑基——后端数据准备,咱得先把“货”备齐
前端再花哨,也得有数据支撑。我们假设已经有了一个简单的文章(Article)和分类(Category)模型。
1. 模型层(models.py)
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100, unique=True)
desc = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
# 关键方法:获取该分类下的已发布文章数量
def get_article_count(self):
# 使用反向查询,避免N+1问题
return self.articles.filter(status='published').count()

最低0.47元/天 解锁文章
318

被折叠的 条评论
为什么被折叠?



