发布评论的问题
问题描述:
不能成功发布评论,也没有 alert 的弹窗提示
相关代码:
1 | views.py<br> from flask import Blueprint, render_template, request, abort, redirect, url_for, flash, jsonify<br> from flask_login import login_required, current_user<br><br> from models import Question, Answer, AnswerComment, db<br> from qa.forms import WriteQuestionForm, WriteAnswerForm<br><br>qa = Blueprint( 'qa' , __name__,<br> template_folder = 'templates' ,<br> static_folder = '../assets' )<br><br><br>@qa.route( '/' )<br> def index():<br> """ 首页 回答列表 """ <br> per_page = 20 # 每页数据的大小<br> page = int(request.args.get('page', 1))<br> page_data = Answer.query.filter_by(is_valid=True).paginate(<br> page=page, per_page=per_page)<br> return render_template('index.html', page_data=page_data)<br><br><br>@qa.route('/follow')<br>def follow():<br> """ 关注 问题列表 """<br> per_page = 20 # 每页数据的大小<br> page = int(request.args.get('page', 1))<br> page_data = Question.query.filter_by(is_valid=True).paginate(<br> page=page, per_page=per_page)<br> return render_template('follow.html', page_data=page_data)<br><br><br>@qa.route('/qa/list')<br>def question_list():<br> """ 查询问题数据列表<br> // json<br> {<br> 'code': 0,<br> 'data': ''<br> }<br> """<br> try:<br> per_page = 2 # 每页数据的大小<br> page = int(request.args.get('page', 1))<br> page_data = Question.query.filter_by(is_valid=True).paginate(<br> page=page, per_page=per_page)<br> data = render_template('qa_list.html', page_data=page_data)<br> return {'code': 0, 'data': data}<br> except Exception as e:<br> print(e)<br> data = ''<br> return {'code': 1, 'data': ''}<br><br><br>@qa.route('/write', methods=['GET', 'POST'])<br>@login_required<br>def write():<br> """ 写文章,提问 """<br> form = WriteQuestionForm()<br> if form.validate_on_submit():<br> try:<br> que_obj = form.save()<br> if que_obj:<br> flash('发布问题成功', 'success')<br> return redirect(url_for('qa.index'))<br> except Exception as e:<br> print(e)<br> flash('发布问题失败,请稍后重试', 'danger')<br> return render_template('write.html', form=form)<br><br><br>@qa.route('/detail/<int:q_id>', methods=['GET', 'POST'])<br>def detail(q_id):<br> """ 问题详情 """<br> # 1. 查询问题信息<br> question = Question.query.get(q_id)<br> if not question.is_valid:<br> abort(404)<br> # 2. 展示第一条回答信息<br> answer = question.answer_list.filter_by(is_valid=True).first()<br> # 添加回答<br> form = WriteAnswerForm()<br> if form.validate_on_submit():<br> try:<br> if not current_user.is_authenticated:<br> flash('请先登录', 'danger')<br> return redirect(url_for('accounts.login'))<br> form.save(question=question)<br> flash('回答问题成功', 'success')<br> return redirect(url_for('qa.detail', q_id=q_id))<br> except Exception as e:<br> print(e)<br> return render_template('detail.html',<br> question=question,<br> answer=answer,<br> form=form)<br><br><br>@qa.route('/comments/<int:answer_id>', methods=['GET', 'POST'])<br>def comments(answer_id):<br> """ 评论 """<br> answer = Answer.query.get(answer_id)<br> if request.method == 'POST':<br> # 添加评论<br> try:<br> if not current_user.is_authenticated:<br> result = {'code': 1, 'message': '请登录'}<br> return jsonify(result), 400<br> # 1. 获取数据<br> content = request.form.get('content', '')<br> reply_id = request.form.get('reply_id', None)<br> # 2. 保存到数据库<br> question = answer.question<br> comment_obj = AnswerComment(content=content,<br> user=current_user,<br> answer=answer,<br> reply_id=reply_id,<br> question=question<br> )<br> db.session.add(comment_obj)<br> db.session.commit()<br> return '', 201<br> except Exception as e:<br> result = {'code': 1, 'message': '服务器正忙,请稍后重试'}<br> return jsonify(result), 400<br> else:<br> # 获取评论列表<br> try:<br> page = int(request.args.get('page', 1))<br> page_data = answer.comment_list().paginate(page=page, per_page=1)<br> data = render_template('comments.html', page_data=page_data, answer=answer)<br> return jsonify({'code': 0, 'data': data, 'meta': {'page': page}}), 200<br> except Exception as e:<br> print(e)<br> return jsonify({'code': 1, 'data': '', 'message': '服务器正忙'}), 500<br><br><br>@qa.route('/comment/love/<int:comment_id>', methods=['POST'])<br># @login_required<br>def comment_love(comment_id):<br> """ 为评论点赞 """<br> try:<br> if not current_user.is_authenticated:<br> return '', 401<br> comment_obj = AnswerComment.query.get(comment_id)<br> comment_obj.love_count += 1<br> db.session.add(comment_obj)<br> db.session.commit()<br> except Exception as e:<br> print(e)<br> abort(500)<br> return '', 201<br>from flask import Blueprint, render_template, request, abort, redirect, url_for, flash, jsonify<br>from flask_login import login_required, current_user<br><br>from models import Question, Answer, AnswerComment, db<br>from qa.forms import WriteQuestionForm, WriteAnswerForm<br><br>qa = Blueprint('qa', __name__,<br> template_folder='templates',<br> static_folder='../assets')<br><br><br>@qa.route('/')<br>def index():<br> """ 首页 回答列表 """<br> per_page = 20 # 每页数据的大小<br> page = int(request.args.get('page', 1))<br> page_data = Answer.query.filter_by(is_valid=True).paginate(<br> page=page, per_page=per_page)<br> return render_template('index.html', page_data=page_data)<br><br><br>@qa.route('/follow')<br>def follow():<br> """ 关注 问题列表 """<br> per_page = 20 # 每页数据的大小<br> page = int(request.args.get('page', 1))<br> page_data = Question.query.filter_by(is_valid=True).paginate(<br> page=page, per_page=per_page)<br> return render_template('follow.html', page_data=page_data)<br><br><br>@qa.route('/qa/list')<br>def question_list():<br> """ 查询问题数据列表<br> // json<br> {<br> 'code': 0,<br> 'data': ''<br> }<br> """<br> try:<br> per_page = 2 # 每页数据的大小<br> page = int(request.args.get('page', 1))<br> page_data = Question.query.filter_by(is_valid=True).paginate(<br> page=page, per_page=per_page)<br> data = render_template('qa_list.html', page_data=page_data)<br> return {'code': 0, 'data': data}<br> except Exception as e:<br> print(e)<br> data = ''<br> return {'code': 1, 'data': ''}<br><br><br>@qa.route('/write', methods=['GET', 'POST'])<br>@login_required<br>def write():<br> """ 写文章,提问 """<br> form = WriteQuestionForm()<br> if form.validate_on_submit():<br> try:<br> que_obj = form.save()<br> if que_obj:<br> flash('发布问题成功', 'success')<br> return redirect(url_for('qa.index'))<br> except Exception as e:<br> print(e)<br> flash('发布问题失败,请稍后重试', 'danger')<br> return render_template('write.html', form=form)<br><br><br>@qa.route('/detail/<int:q_id>', methods=['GET', 'POST'])<br>def detail(q_id):<br> """ 问题详情 """<br> # 1. 查询问题信息<br> question = Question.query.get(q_id)<br> if not question.is_valid:<br> abort(404)<br> # 2. 展示第一条回答信息<br> answer = question.answer_list.filter_by(is_valid=True).first()<br> # 添加回答<br> form = WriteAnswerForm()<br> if form.validate_on_submit():<br> try:<br> if not current_user.is_authenticated:<br> flash('请先登录', 'danger')<br> return redirect(url_for('accounts.login'))<br> form.save(question=question)<br> flash('回答问题成功', 'success')<br> return redirect(url_for('qa.detail', q_id=q_id))<br> except Exception as e:<br> print(e)<br> return render_template('detail.html',<br> question=question,<br> answer=answer,<br> form=form)<br><br><br>@qa.route('/comments/<int:answer_id>', methods=['GET', 'POST'])<br>def comments(answer_id):<br> """ 评论 """<br> answer = Answer.query.get(answer_id)<br> if request.method == 'POST':<br> # 添加评论<br> try:<br> if not current_user.is_authenticated:<br> result = {'code': 1, 'message': '请登录'}<br> return jsonify(result), 400<br> # 1. 获取数据<br> content = request.form.get('content', '')<br> reply_id = request.form.get('reply_id', None)<br> # 2. 保存到数据库<br> question = answer.question<br> comment_obj = AnswerComment(content=content,<br> user=current_user,<br> answer=answer,<br> reply_id=reply_id,<br> question=question<br> )<br> db.session.add(comment_obj)<br> db.session.commit()<br> return '', 201<br> except Exception as e:<br> result = {'code': 1, 'message': '服务器正忙,请稍后重试'}<br> return jsonify(result), 400<br> else:<br> # 获取评论列表<br> try:<br> page = int(request.args.get('page', 1))<br> page_data = answer.comment_list().paginate(page=page, per_page=1)<br> data = render_template('comments.html', page_data=page_data, answer=answer)<br> return jsonify({'code': 0, 'data': data, 'meta': {'page': page}}), 200<br> except Exception as e:<br> print(e)<br> return jsonify({'code': 1, 'data': '', 'message': '服务器正忙'}), 500<br><br><br>@qa.route('/comment/love/<int:comment_id>', methods=['POST'])<br># @login_required<br>def comment_love(comment_id):<br> """ 为评论点赞 """<br> try:<br> if not current_user.is_authenticated:<br> return '', 401<br> comment_obj = AnswerComment.query.get(comment_id)<br> comment_obj.love_count += 1<br> db.session.add(comment_obj)<br> db.session.commit()<br> except Exception as e:<br> print(e)<br> abort(500)<br> return '', 201<br><br> detail.html<br> {% extends 'base_layout.html' %}<br>{% from 'macro/answer_comment_item.html' import comment_item_show %}<br>{% block title %}{{ super() }} - 文章详情{% endblock %}<br>{% block header %}<br> <link rel="stylesheet" href="/assets/style/detail.css"><br>{% endblock %}<br>{% block content %}<br><!-- 问题简述 --><br><div class="layout-question"><br> <div class="container"><br> <div class="row"><br> <div class="col-md-9"><br> {% include 'components/flash_messages.html' %}<br> <!-- 问题标签 --><br> {% if question.tags %}<br> <ul class="que-tag-ls"><br> {% for tag in question.tags %}<br> <li><a href="#">{{ tag.tag_name }}</a></li><br> {% endfor %}<br> </ul><br> {% endif %}<br> <!-- // 问题标签 --><br> <h3>{{ question.title }}</h3><br> <div class="show-desc hidden"><br> {{ question.desc|d('暂无', True) }}…<br> <span class="btn-show-more">显示全部<i class="glyphicon glyphicon-menu-down"></i></span><br> </div><br> <div class="show-all "><br> {% autoescape false %}<br> {{ question.content|safe }}<br> {% endautoescape %}<br> <span class="btn-show-less">收起<i class="glyphicon glyphicon-menu-up"></i></span><br> </div><br> <!-- 菜单栏 --><br> <div class="qa-footer"><br> <div><br> <button type="button" class="btn btn-info btn-sm">关 注</button><br> </div><br> <div><br> <button type="button" class="btn btn-info btn-sm" data-toggle="modal" data-target="#addComment"><br> 写回答<br> </button><br> </div><br> <div class="txt-menu"><i class="glyphicon glyphicon-comment"></i> {{ question.comment_count }}条评论<br> </div><br> <div class="txt-menu"><i class="glyphicon glyphicon-send"></i>分享</div><br> <div class="txt-menu"><i class="glyphicon glyphicon-flag"></i>举报</div><br> <div class="txt-menu"></div><br> <div class="txt-menu btn-group"><br> <i class="glyphicon glyphicon-option-horizontal dropdown-toggle" data-toggle="dropdown"<br> aria-haspopup="true" aria-expanded="false"></i><br> <ul class="dropdown-menu"><br> <li><a href="#">不感兴趣</a></li><br> </ul><br> </div><br> </div><br> <!-- //菜单栏 --><br> </div><br> <div class="col-md-3"><br> <div class="que-stats-box"><br> <!-- 关注者 --><br> <div><br> <span>关注者</span><br> <strong>{{ question.follow_count|number_split }}</strong><br> </div><br> <!-- //关注者 --><br> <!-- 被浏览 --><br> <div><br> <span>被浏览</span><br> <strong>{{ question.view_count|number_split }}</strong><br> </div><br> <!-- //被浏览 --><br> </div><br> </div><br> </div><!-- // row --><br> </div><br></div><br><!-- // 问题简述 --><br><br><div class="layout-answer"><br> <div class="container"><br> <div class="row"><br> <div class="col-md-9 left-content"><br> {% block link_more %}<br> <a class="link-more" href="#">查看全部 {{ question.answer_count|number_split }} 个回答</a><br> {% endblock %}<br> <!-- 回答内容区域 --><br> {% if answer %}<br> <div class="answer-content box-wrap"><br> <div class="user-info"><br> <div class="avater"><br> {% if answer.user.avatar %}<br> <img src="{{ answer.user.avatar }}" alt="用户头像"><br> {% else %}<br> <img src="/assets/home/qa/user_head.jpg" alt="用户头像"><br> {% endif %}<br> </div><br> <div class="desc"><br> <h4>{{ answer.user.nickname }}</h4><br> <p>{{ answer.user.profile.maxim }}</p><br> </div><br> </div><br> <div class="answer-stats">5,550 人赞同了该回答</div><br> <div class="answer-txt"><br> {% autoescape false %}<br> {{ answer.content|safe }}<br> {% endautoescape %}<br> </div><br> <div class="answer-time">发布于{{ answer.created_at }}</div><br> <!-- 底部菜单 --><br> <div class="qa-footer"><br> <div><br> <button type="button" class="btn btn-info btn-sm"><br> <i class="glyphicon glyphicon-thumbs-up"></i> 赞同 {{ answer.love_count }}</button><br> <button type="button" class="btn btn-info btn-sm"><i<br> class="glyphicon glyphicon-thumbs-down"></i></button><br> </div><br> <div class="txt-menu"><i class="glyphicon glyphicon-comment"></i> 113条评论</div><br> <div class="txt-menu"><i class="glyphicon glyphicon-send"></i>分享</div><br> <div class="txt-menu"><i class="glyphicon glyphicon-heart"></i>收藏</div><br> <div class="txt-menu"><i class="glyphicon glyphicon-flag"></i>举报</div><br> <div class="txt-menu"></div><br> <div class="txt-menu btn-group"><br> <i class="glyphicon glyphicon-option-horizontal dropdown-toggle" data-toggle="dropdown"<br> aria-haspopup="true" aria-expanded="false"></i><br> <ul class="dropdown-menu"><br> <li><a href="#">不感兴趣</a></li><br> </ul><br> </div><br> </div><br> <!-- // 底部菜单 --><br> <!-- 评论框 --><br> <div class="comment-box box-wrap"><br> <!-- 统计和菜单 --><br> <div class="comment-stats"><br> <div class="title">{{ answer.comment_count|d('0', True) }}条评论</div><br> <div class="menu"><i class="glyphicon glyphicon-random"></i>切换为时间顺序</div><br> </div><br> <!-- // 统计和菜单 --><br> <!-- 评论列表 --><br> <div class="comment-ls" id="id-comment-ls"><br> <p>内容正在加载中</p><br> </div><br> <!-- // 评论列表 --><br> <nav aria-label="..."><br> <ul class="pager"><br> <li class="previous"><a href="javascript:;"><span aria-hidden="true">←</span><br> 上一页</a></li><br> <li class="next"><a href="javascript:void(0);">下一页 <span<br> aria-hidden="true">→</span></a></li><br> </ul><br> </nav><br> <!-- 发表评论 --><br> <form class="form-horizontal comment-publish"><br> <input type="text" name="content" class="form-control" placeholder="写下你的评论..."><br> <button type="button" class="btn btn-default btn-grey">发布</button><br> </form><br> <!-- // 发表评论 --><br> </div><br> <!-- // 评论框 --><br> </div><br> {% else %}<br> <div class="answer-content box-wrap"><br> 暂无人回答该问题<br> </div><br> {% endif %}<br> <!-- // 回答内容区域 --><br> {{ self.link_more() }}<br> </div><br> <div class="col-md-3 right-content"><br> <!-- 关于作者 --><br> <div class="about-user box-wrap"><br> <div class="user-info"><br> <div class="avater"><br> <img src="/assets/home/qa/user_head.jpg" alt="用户头像"><br> </div><br> <div class="desc"><br> <h4>舒大克</h4><br> <p>《互联网营销人实战手记》新书上市; 公众号:舒大克。</p><br> </div><br> </div><br> <!-- 用户统计 --><br> <div class="qa-stats"><br> <div><br> <span>回答</span><br> <strong>309</strong><br> </div><br> <div><br> <span>文章</span><br> <strong>40</strong><br> </div><br> <div><br> <span>关注者</span><br> <strong>85,265</strong><br> </div><br> </div><br> <!-- // 用户统计 --><br> <div class="menu-ls"><br> <div><br> <a href="#" class="btn btn-info btn-sm"><i class="glyphicon glyphicon-plus"></i>关注他</a><br> </div><br> <div><br> <a href="#" class="btn btn-default btn-sm btn-grey"><i<br> class="glyphicon glyphicon-comment"></i>发私信</a><br> </div><br> </div><br> </div><br> <!-- //关于作者 --><br> <!-- 相关问题 --><br> <div class="rel-ques box-wrap"><br> <div class="title">相关问题</div><br> <div class="rel-que-ls"><br> <div><br> <a href="#">疫情过后,你会报复性消费吗?</a><span>30 个回答</span><br> </div><br> <div><br> <a href="#">疫情过后你最想去哪?和谁一起?</a><span>19 个回答</span><br> </div><br> <div><br> <a href="#">如果能熬过这波疫情,你最想做的事情是什么?</a><span>21 个回答</span><br> </div><br> <div><br> <a href="#">请问这次疫情可能有积极影响吗?</a><span>9 个回答</span><br> </div><br> <div><br> <a href="#">如果疫情结束了你最想做什么?</a><span>3 个回答</span><br> </div><br> </div><br> </div><br> <!-- //相关问题 --><br> <!-- 右侧页脚 --><br> <div class="right-footer"><br> <a href="#">用户指南</a><span class="dot">·</span><br> <a href="#">用户使用协议</a><span class="dot">·</span><br> <a href="#">用户隐私权政策</a><br> <br/><br> <a href="#">侵权举报</a><span class="dot">·</span><br> <a href="#">网上有害信息举报专区</a><br> <br/><br> <a href="#">京ICP证 第10001000号</a><br> <br/><br> <a href="#">京ICP备 第10001000号</a><br> <br/><br> <a href="#">联系我们 © 2020在线问答</a><br> </div><br> <!-- //右侧页脚 --><br> </div><br> </div><br> </div><br></div><br><div class="layout-footer"><br> <a href="#" data-toggle="tooltip" title="意见反馈"><i class="glyphicon glyphicon-briefcase"></i></a><br> <a href="#" data-toggle="tooltip" title="回到顶部"><i class="glyphicon glyphicon-arrow-up"></i></a><br></div><br><!-- 写回答,对话框 --><br><div class="modal fade" id="addComment" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"><br> <form class="form-horizontal modal-dialog" role="document"<br> method="post" action="{{ url_for('qa.detail', q_id=question.id) }}"><br> {{ form.csrf_token }}<br> <div class="modal-content"><br> <div class="modal-header"><br> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span<br> aria-hidden="true">×</span></button><br> <h4 class="modal-title" id="myModalLabel">写回答</h4><br> </div><br> <div class="modal-body"><br> <div class="form-group"><br> {{ form.content }}<br> {{ ckeditor.load() }}<br> {{ ckeditor.config(name='content') }}<br> </div><br> </div><br> <div class="modal-footer"><br> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><br> <button type="submit" class="btn btn-primary">提交</button><br> </div><br> </div><br> </form><br></div><br><!-- // 写回答,对话框 --><br>{% endblock %}<br>{% block js_inline %}<br> // 点击,查看更多,把详细的那个p标签展示出来,把自己隐藏<br> $('.show-desc').click(function () {<br> $(this).addClass('hidden');<br> $(this).next().removeClass('hidden')<br> })<br> $('.show-all').click(function () {<br> $(this).addClass('hidden');<br> $(this).prev().removeClass('hidden')<br> })<br>{% endblock %}<br>{% block js_extra %}<br> <script><br> $(function () {<br> /**<br> * 绑定评论的表单提交对象<br> * @param html<br> */<br> function bindCommentPublishEvent(html) {<br> let form = $('.comment-publish', html);<br> $('.btn', form).click(function () {<br> let _form = $(this).parent();<br> let content = $('input[name=content]', _form);<br> let data = _form.serialize();<br> $.ajax({<br> url: '{{ url_for("qa.comments", answer_id=answer.id) }}',<br> method: 'post',<br> data: data,<br> complete: function (res) {<br> console.log('res:', res)<br> if (res.status === 201) {<br> window.alert('评论成功');<br> content.val('')<br> } else if (res.status === 400) {<br> window.alert(res.responseJSON.message);<br> } else {<br> window.alert('请求失败, 请稍后重试');<br> }<br> }<br> })<br> })<br> }<br><br><br> // 评论回复按钮事件<br> function bindReplyEvent(html) {<br> $('.link-reply', html).click(function () {<br> let _id = $(this).data('id');<br> let _form = $('#id-comment-' + _id);<br> _form.removeClass('hidden');<br> });<br> }<br><br> /**<br> * 绑定点赞事件<br> * @param html<br> */<br> function bindCommentLoveEvent(html) {<br> $(".link-love", html).click(function () {<br> let _this = $(this);<br> let url = $(this).data('url');<br> $.ajax({<br> url: url,<br> method: 'post',<br> data: {},<br> complete: function (res) {<br> console.log('res:', res)<br> if (res.status === 201) {<br> window.alert('点赞成功');<br> let count = $('span', _this).text();<br> count = parseInt(count) + 1;<br> $('span', _this).text(count)<br> } else if (res.status === 401) {<br> window.alert('请登录');<br> window.location.href = '{{ url_for("accounts.login") }}';<br> } else {<br> window.alert('服务器正忙')<br> }<br> }<br> })<br> })<br> }<br><br><br> // 评论列表的异步加载<br> let coment_ls = $('#id-comment-ls');<br> let page = 1;<br><br> function loadPageData(page) {<br> page = page || 1<br> $.ajax({<br> url: '{{ url_for("qa.comments", answer_id=answer.id) }}',<br> method: 'get',<br> data: {<br> page: page<br> },<br> complete: function (res) {<br> if (res.status === 200) {<br> let result = res.responseJSON;<br> if (result.code === 0) {<br> let html = $(result.data);<br> // 绑定回复事件<br> bindReplyEvent(html);<br> bindCommentPublishEvent(html);<br> // 绑定评论点赞事件<br> bindCommentLoveEvent(html);<br> coment_ls.empty().append(html)<br> } else {<br><br> }<br> } else {<br> window.alert('服务器正忙')<br> }<br> }<br> })<br> }<br><br> $('.pager .previous').click(function () {<br> page = page - 1;<br> loadPageData(page);<br> })<br> $('.pager .next').click(function () {<br> page = page + 1;<br> loadPageData(page);<br> });<br> // 默认加载第一页数据<br> loadPageData(page);<br> })<br> </script><br>{% endblock %}<br><br><br> |
18
收起
正在回答 回答被采纳积分+1
1回答
Python全栈工程师2020
- 参与学习 人
- 提交作业 5238 份
- 解答问题 2433 个
Facebook曾声称“只招全栈工程师”!全栈用人需求猛增,市面人才紧缺。 0基础进击Python全栈开发,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧