完成评论功能
- 定义评论的视图函数
@app.route('/comment/',methods=['POST'])
def comment():
读取前端页面数据,保存到数据库中 - 用<input type="hidden" 方法获取前端的"question_id"
- 显示评论次数
- 要求评论前登录
- 尝试实现详情页面下的评论列表显示
py
from flask import Flask, render_template, request, redirect, url_for, session from flask_sqlalchemy import SQLAlchemy from functools import wraps from datetime import datetime import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) Username = db.Column(db.String(20), nullable=False) Password = db.Column(db.String(20), nullable=False) Telphone = db.Column(db.String(20), nullable=True) class Question(db.Model): __tablename__ = 'question' id = db.Column(db.Integer, primary_key=True, autoincrement=True) author_id = db.Column(db.Integer,db.ForeignKey('user.id')) title = db.Column(db.String(100), nullable=False) detail = db.Column(db.Text, nullable=False) creat_time = db.Column(db.DateTime, default=datetime.now) author = db.relationship('User', backref=db.backref('question')) class Comment(db.Model): __tablename__ = 'comment' id = db.Column(db.Integer, primary_key=True, autoincrement=True) author_id = db.Column(db.Integer,db.ForeignKey('user.id'))#外键 question_id=db.Column(db.Integer,db.ForeignKey('question.id'))#外键 detail = db.Column(db.Text, nullable=False) creat_time = db.Column(db.DateTime, default=datetime.now) question=db.relationship('Question',backref=db.backref('comments',order_by=creat_time.desc)) author = db.relationship('User', backref=db.backref('comments')) # db.create_all() @app.route('/',methods=['GET','POST']) def index(): context = { 'questions':Question.query.all() } return render_template('index.html',**context) @app.route('/login/', methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('login.html') else: usern = request.form.get('Username') passn = request.form.get('Password') user = User.query.filter(User.Username == usern).first() if user: if user.Password == passn: session['user'] = usern return redirect(url_for('index')) else: return '密码错误' # return window.alert("密码错误") else: # return window.alert("用户名不存在") return '用户名不存在' @app.context_processor def mycontext(): usern = session.get('user') if usern: return {'Username': usern} else: return {} def login_re(func): @wraps(func) def wrapper(*args, **kwargs): if session.get('user'): return func(*args, **kwargs) else: return redirect(url_for('login')) return wrapper @app.route('/logout/') def logout(): session.clear() return redirect(url_for("index")) @app.route('/register/', methods=['GET', 'POST']) def register(): if request.method == 'GET': return render_template('register.html') else: usern = request.form.get('Username') passn = request.form.get('Password') teln = request.form.get('Telphone') user = User.query.filter(User.Username == usern).first() if user: return '用户名已经存在' else: user1 = User(Username=usern, Password=passn, Telphone=teln) db.session.add(user1) db.session.commit() return redirect(url_for('login')) @app.route('/question/', methods=['GET', 'POST']) @login_re def question(): if request.method == 'GET': return render_template('question.html') else: an = User.query.filter(User.Username == session.get('user')).first().id tn= request.form.get('title') dn = request.form.get('detail') question1 = Question(author_id=an,title=tn, detail=dn) # question.author=User db.session.add(question1) # 数据库,添加操作 db.session.commit() #提交 return redirect(url_for('index')) @app.route('/detail/<question_id>') def detail(question_id): quest=Question.query.filter(Question.id==question_id).first() return render_template('detail.html', ques=quest) # return redirect(url_for("detail.html")) @app.route('/comment/', methods=['POST']) @login_re def comment(): comment= request.form.get('commentdetail') ques_id=request.form.get('question_id') auth_id=User.query.filter(User.Username==session.get('user')).first().id comm=Comment(author_id=auth_id,question_id=ques_id,detail=comment) # question.author=User db.session.add(comm) # 数据库,添加操作 db.session.commit() #提交 return redirect(url_for('detail', question_id=ques_id)) if __name__ == '__main__': app.run(debug=True)
html
{% extends 'base.html' %} {% block title %}详情页{% endblock %} {% block head %} {# <script src="{{ url_for('static',filename='js/base.js') }}" type="text/javascript"></script>#} <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/detail.css') }}"> {% endblock %} {% block main %} <div align="center"> <div class="xianshi"> <h3>{{ ques.title }}<br> <small>{{ ques.author.Username }} <span class="badge">{{ ques.creat_time }}</span></small> </h3> </div> <p class="lead">{{ ques.detail }}</p> <hr> <form action="{{ url_for('comment') }}" method="post"> <div class="ping"> <div class="pinglun"><label for="comment">评论</label><br></div> <textarea id="comment" rows="8" name="commentdetail" PLACEHOLDER="写下你的评论"></textarea> <input name="question_id" type="hidden" value="{{ ques.id }}"/> <div class="but"> <button type="submit" class="fasong">发送评论</button> </div> <h4 align="left">评论:({{ ques.comments|length }})</h4> </div> </form> <div class="pl"> <ul> {% for foo in ques.comments %} <li> <a href="#">{{ foo.author.Username }}</a> <a class="creat_time" href="#">{{ foo.creat_time }}</a> <a class="title" href="{{ url_for('detail',question_id=foo.id) }}">{{ foo.title }}</a> <p class="abstract">{{ foo.detail }}</p> </li> {% endfor %}</ul> </div> </div> {% endblock %}