进阶任务 · 设计一个真正的 Django 小应用(可选) #17
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
本任务规则:
今日目标
做一个社团招新管理系统:成员(Member)发布文章(Article),成员可以评论(Comment)。
覆盖:模型设计、ORM 查询、视图、URL 路由、模板、以及"从请求到响应"的完整链路。
环境准备
题目一(必做):设计数据模型 models.py
背景:一个博客/招新系统,核心数据是"文章",文章有作者,作者是社团成员,文章下面有评论。
要求:在
blog/models.py里写出完整代码,包含三个模型:nickname、邮箱email(要唯一)、加入时间
joined_at(自动记录创建时间)、简介bio(允许为空)title、正文content、作者author(外键 → Member,作者被删时文章级联删除)、是否发布
is_published(默认 False)、发布时间
created_at(自动记录)、浏览量views(默认 0)content、所属文章article(外键,
related_name="comments")、评论者commenter(外键 → Member)四个要求:
__str__(Article 返回标题,Comment 返回"评论者 + 内容前 20 字",Member 返回昵称)Meta设置排序:Article 按created_at倒序,Comment 按id正序max_length、default、null=True/blank=True该加的地方要加思考题(写进注释):
on_delete=models.CASCADE?如果改成SET_NULL会发生什么、需要什么前提?related_name="comments"是干什么的?(提示:article.comments.all()是什么?)题目二(必做):写视图 + ORM 查询 views.py
要求:在
blog/views.py里写四个视图函数:index(request):查出所有已发布的文章(is_published=True),按时间倒序,渲染
index.html,把文章列表传进模板article_detail(request, pk):用get()取单篇文章,不存在时抛Http404;浏览量 +1 并保存;渲染
detail.htmladd_comment(request, pk):POST 请求时读取request.POST里的content,创建一条评论(评论者先用
Member.objects.first()随便取一个,我们还没做登录),完成后重定向回文章详情页;GET 请求也直接重定向回详情页
author_articles(request, nickname):按作者昵称查该作者的全部文章,并且用 ORM 统计每篇文章的评论数(提示:
annotate+Count,配合related_name),渲染
author.html。想不出annotate就先用 Python 算,但要写一句注释说明两种做法的区别思考题(写进注释):
a)
article.views += 1; article.save()b)
Article.objects.filter(pk=pk).update(views=F("views") + 1)两个请求同时点击文章时,a 会出什么问题?b 为什么没问题?(提示:并发 / 原子性)
题目三(必做):URL 路由 + 完整链路说明
要求:
urls.py(含include)和应用级blog/urls.py,路由表覆盖:""→index/article/<int:pk>/→article_detail/article/<int:pk>/comment/→add_comment/author/<str:nickname>/→author_articles每个路由都要起
name。/article/3/回车后,从"请求到响应"经历了哪些环节?必须提到:URL 匹配、视图函数、
ORM 查询、
render、模板、HttpResponse这几个词。index.html的模板片段:{% for %}循环展示文章标题和"查看详情"链接created_at格式化成Y-m-d H:i完成标准
python manage.py runserver后列表页、详情页、评论、作者页都能访问验收动作(强烈建议):跑起来
runserver,在浏览器里真的走一遍"打开列表页 → 点进文章 → 提交评论 → 回到详情页看到评论"。
能跑通,再带着对每道思考题的理解去找学长验收。
完成后打开
参考解答.md对照。