资讯专栏INFORMATION COLUMN

14.问题详情页面以及添加评论

or0fun / 3014人阅读

摘要:现在在首页我们已经可以看到展示的问题了,我们再设计一个问题的详情页,通过点击问题的标题进去,可以给问题添加评论或者回答。

现在在首页我们已经可以看到展示的问题了,我们再设计一个问题的详情页,通过点击问题的标题进去,可以给问题添加评论或者回答。


问题的详情页都使用一个名为"details.html"的模板,其网址我们设计成"/details//"的形式,这时候我们可以用到一开始提到过的url传参,编写对应的视图函数如下:

@app.route("/details//")
def details(question_id):
    question_obj = Questions.query.filter(Questions.id == question_id).first()
    return render_template("details.html", question=question_obj)

这部分代码也很简单,将url的参数question_id传递给函数,函数用question_id返回一个question模型的对象,并将其传递给模板,在模板中处理quesiton对象,包括解析其title/content/author以及对应的comments(在模型部分我们已经建立了QuestionsComments的关系和引用)。为首页问题的title添加链接:

{{ question.title }}

details.html核心代码(其余部分继承base.html)如下:

{% block body_part %}
    

{{ question.title }}

作者:{{ question.author.username }} 时间:{{ question.create_time }}


{{ question.content }}


    {# {% for comment in question.comments | sort(attribute="create_time",reverse=true) %} #} {% for comment in question.comments %}
  • {{ comment.content }}
    {{ comment.author.username }} {{ comment.create_time }}

  • {% endfor %}
{% endblock %}

此时还没有添加评论功能,我手动往数据库写了一条评论,来查看html的效果,如下:

我们再添加评论(或者说回答)的功能,其实就是加个POST表单,和注册的逻辑是一样的,为html增加下面的代码,放在问题和评论之间:

评论({{ question.comments | length }}):

这里用了一个length过滤器来获取comments的数量。修改detail视图函数,为其增加POST方法如下:

@app.route("/question/", methods=["GET", "POST"])
def question():
    if request.method == "GET":
        return render_template("question.html")
    else:
        if hasattr(g, "user"):
            question_title = request.form.get("question_title")
            question_desc = request.form.get("question_desc")
            author_id = g.user.id
            new_question = Questions(title=question_title, content=question_desc, author_id=author_id)
            db.session.add(new_question)
            db.session.commit()
            return redirect(url_for("home"))
        else:
            flash("请先登录")
            return redirect(url_for("login"))

这部分与前面的文章中发布问答的视图函数也是很像的,无需重复讲解,经测试发布评论功能以及可以使用了。
最后美化界面如下:


补充:
由于在前文中我们的Comments模型通过以下代码和Users/Questions都建立了关系:

author = db.relationship("Users", backref=db.backref("comments"))
question = db.relationship("Questions", backref=db.backref("comments", order_by=create_time.desc()))

我们在新增comment的时候,这条代码:

comment = Comments(content=content, question_id=question_id, author_id=g.user.id)

就可以改成:

comment = Comments(content=content)
comment.author = g.user
comment.question = Questions.query.filter(Questions.id == question_id).first()

虽然看上去长了,但可能更容易看出模型之间的关系了,anyway,两种方式都是OK的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41284.html

相关文章

  • Django 博客开发教程 12 - 评论

    摘要:创建了数据库模型就要迁移数据库,迁移数据库的命令也在前面讲过。如果表单对应有一个数据库模型例如这里的评论表单对应着评论模型,那么使用类会简单很多,这是为我们提供的方便。表明这个表单对应的数据库模型是类。 创建评论应用 相对来说,评论其实是另外一个比较独立的功能。Django 提倡,如果功能相对比较独立的话,最好是创建一个应用,把相应的功能代码写到这个应用里。我们的第一个应用叫 blog...

    wangbinke 评论0 收藏0
  • Django搭建个人博客:锚点定位

    摘要:在父页面中文章详情模板添加需要执行锚点拼接的函数新增函数,处理二级回复去除尾部符号刷新并定位到锚点函数中运用了的三元运算符,翻译成人话就是如果成立则返回,如果不成立就返回。 老读者注意:上一章消息通知有个bug,即发给管理员的notify必须移动到new_comment.save()的后面,否则会导致action_object存储为NULL,并且导致本章的html拼接锚点失效。原文已...

    xi4oh4o 评论0 收藏0
  • Django搭建个人博客:使用django-ckeditor富文本编辑器

    摘要:后面两个编辑器自带,不用单独下载,添上就可以了添加相关插件这样就完成了代码高亮效果不错在前台使用为了让用户在前台也能使用富文本编辑器,还得对代码稍加改动。对于有些不喜欢的人来说,甚至可以连博文都使用提供的富文本编辑器。 前面我们已经实现了用Markdown语法写文章了。但是文章的评论用Markdown就不太合适了,你不能强求用户也花时间去熟悉语法啊。另外评论中通常还有表情、带颜色的字体...

    beanlam 评论0 收藏0
  • 基于vue2 + muse-ui构建的移动端、PC端轻社区项目 F-Rent 友租

    摘要:如果有什么可以帮到你的无论是不是此项目中的问题都可以在提出我会尽我所能帮你解决欢迎大佬们提出好的问题和点子,我会第一时间去修正。 前言 本项目(友租)是基于Vue2、Vuex、Muse-UI、es6、webpack构建的一个移动端、PC端轻社区项目 项目地址GitHub 项目更新历史 开发环境 Macos + Vs code + Chrome 项目的灵感最初来源:由于我是一个宅男在...

    linkFly 评论0 收藏0

发表评论

0条评论

or0fun

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<