从首页问答标题到问答详情页

  1. 主PY文件写视图函数,带id参数。 
    @app.route('/detail/<question_id>')
    def detail(question_id):
        quest = 
        return render_template('detail.html', ques = quest)
    from flask import Flask,render_template,request,redirect,url_for,session
    from flask_sqlalchemy import SQLAlchemy
    import config
    from datetime import datetime
    from functools import wraps
    
    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)
    db.create_all()
    
    class Question(db.Model):
        __tablename__ = 'Question'
        id=db.Column(db.Integer,primary_key=True,autoincrement=True)
        title=db.Column(db.String(100),nullable=False)
        detail=db.Column(db.Text,nullable=False)
        creat_time=db.Column(db.DateTime,default=datetime.now)
        authorID=db.Column(db.Integer,db.ForeignKey('User.id'))
        author=db.relationship('User',backref=db.backref('question'))
    db.create_all()
    
    class Comment(db.Model):
        __tablname__='comment'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        authorID = db.Column(db.Integer, db.ForeignKey('User.id'))
        questionID = 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('commment',order_by=creat_time.desc))
        author = db.relationship('User', backref=db.backref('comment'))
    db.create_all()
    
    
    @app.route('/')
    def home():
        context={
            'question': Question.query.all()
        }
        return render_template('shouye.html',**context)
    
    @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)
    
    @app.route('/sign_in/',methods=['GET','POST'])
    def sign_in():
        if request.method == 'GET':
            return render_template('denglu.html')
        else:
            username = request.form.get('username')
            password = request.form.get('password')
            user = User.query.filter(User.username == username).first()
            if user:
                if user.password == password:
                    session['user']=username
                    session.permanent = True
                    return redirect(url_for('home'))
                else:
                    return 'password error'
            else:
                return 'username is not existed.'
    
    
    @app.route('/sign_up/',methods=['GET','POST'])
    def sign_up():
        if request.method == 'GET':
            return render_template('zhuce.html')
        else:
            username = request.form.get('username')
            password = request.form.get('password')
            user = User.query.filter(User.username == username).first()
            if user:
                return 'username existed.'
            else:
                user1 = User(username=username, password=password)
                db.session.add(user1)
                db.session.commit()
                return redirect(url_for('home'))
    
    @app.context_processor
    def mycontext():
        username=session.get('user')
        if username:
            return {'username':username}
        else:
            return {}
    @app.route('/logout/') #注销
    def logout():
        session.clear()
        return redirect(url_for('home'))
    
    def loginFirst(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            if session.get('user'):
                return func(*args, **kwargs)
            else:
                return redirect(url_for('sign_in'))
        return wrapper
    
    @app.route('/question/',methods=['GET','POST'])
    @loginFirst
    def question():
        if request.method == 'GET':
            return render_template('question.html')
        else:
            title = request.form.get('title')
            detail = request.form.get('detail')
            authorID =User.query.filter(User.username == session.get('user')).first().id
            user = User.query.filter(User.username == session.get('user')).first()
            question = Question.query.filter(Question.title == title).first()
            if question:
                return 'question existed'
            else:
                questions = Question(title=title, detail=detail, authorID=authorID)
                questions.author = user
                db.session.add(questions)
                db.session.commit()
                return redirect(url_for(('home')))
    
    if __name__ == '__main__':
        app.run(debug=True)

     


  2. 首页标题的标签做带参数的链接。
          {{ url_for('detail',question_id = foo.id) }}
    {% extends'base.html' %}
    {% block title %}
        Home
    {% endblock %}
    {% block head %}
        <link rel="stylesheet" href="{{ url_for('static',filename='css/shouye.css')}}" type="text/css">
    {% endblock %}
    {% block main %}
    <body>
    
    <br>
    {#<img id="pig" src="../static/images/pig.jpg">#}
    <ul class="comment"style=";list-style:none">
        <img class="comment_pic"  src="../static/images/comment.png">
        <p class="wenzi">Question</p>
        {% for foo in question %}
    
        <li class="detail" >
            <span class="icon" aria-hidden="true"><img src="../static/images/icon.jpg"></span>
            <a href="#" style="float: left;margin:3px auto; line-height:12px;">{{ foo.author.username }}</a>
             <span class="badge">{{ foo.creat_time }}</span>
            <br><hr>
            <a href="{{ url_for('detail',question_id=foo.id) }}" class="title">&nbsp;{{ foo.title }}</a>
            <p class="neirong">&nbsp;{{ foo.detail }}</p>
        </li>
    
        {% endfor %}
    
    </ul>
    
    </body>
    {% endblock %}

     

  3. 在详情页将数据的显示在恰当的位置。 
    {{ ques.title}}
    {{ ques.id  }}{{  ques.creat_time }}
    {{ ques.author.username }} 
    {{ ques.detail }}
    {% extends'base.html' %}
    {% block title %}
        Home
    {% endblock %}
    {% block head %}
        <link rel="stylesheet" href="{{ url_for('static',filename='css/detail.css')}}" type="text/css">
    {% endblock %}
    {% block main %}
    <body>
    <div class="detail">
        <div class="detail_left">
        <h2>{{ ques.title }}</h2>
        <a>{{ ques.author.username }}</a>
    <span class="badge">{{ ques.creat_time }}</span>
        <hr>
        <a>{{ ques.detail }}</a>
        <hr>
        <textarea name='comment' class="form-control" rows="8" id="questionDetail"></textarea>
        <br><button class="btn-default">发布</button>
        <p>评论:{{ ques.comments }}</p>
        <li class="comment">
            <span class="icon" aria-hidden="true"><img src="../static/images/icon.jpg"></span>
            <a href="#" style="float: left;margin:3px auto; line-height:12px;">username</a>
             <span class="badge2">creat_time</span>
            <br><hr>
            <p class="neirong">detail</p>
        </li>
         <li class="comment">
            <span class="icon" aria-hidden="true"><img src="../static/images/icon.jpg"></span>
            <a href="#" style="float: left;margin:3px auto; line-height:12px;">username</a>
             <span class="badge2">creat_time</span>
            <br><hr>
            <p class="neirong">detail</p>
        </li>
    
    </div>
    </div>
    </body>
    {% endblock %}

     

  4. 建立评论的对象关系映射:

    class Comment(db.Model):
        __tablename__='comment'

    from flask import Flask,render_template,request,redirect,url_for,session
    from flask_sqlalchemy import SQLAlchemy
    import config
    from datetime import datetime
    from functools import wraps
    
    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)
    db.create_all()
    
    class Question(db.Model):
        __tablename__ = 'Question'
        id=db.Column(db.Integer,primary_key=True,autoincrement=True)
        title=db.Column(db.String(100),nullable=False)
        detail=db.Column(db.Text,nullable=False)
        creat_time=db.Column(db.DateTime,default=datetime.now)
        authorID=db.Column(db.Integer,db.ForeignKey('User.id'))
        author=db.relationship('User',backref=db.backref('question'))
    db.create_all()
    
    class Comment(db.Model):
        __tablname__='comment'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        authorID = db.Column(db.Integer, db.ForeignKey('User.id'))
        questionID = 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('commment',order_by=creat_time.desc))
        author = db.relationship('User', backref=db.backref('comment'))
    db.create_all()
    
    @app.route('/comment/',methods=['POST'])
    @login_re
    def comment():
        if request.method == 'GET':
            return render_template('detail.html')
        else:
    
            detail = request.form.get('detail')
            question_id = User.query.filter(User.username == session.get('user')).first().id
            comment = Comment( detail=detail, question_id=question_id)
            db.session.add(comment)
            db.session.commit()
        return redirect(url_for('index'))
    
    def login_re(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if session.get('comment'):
                return func(*args,**kwargs)
            else:
                return redirect(url_for('login'))
        return wrapper
    
    @app.route('/')
    def home():
        context={
            'question': Question.query.all()
        }
        return render_template('shouye.html',**context)
    
    @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)
    
    @app.route('/sign_in/',methods=['GET','POST'])
    def sign_in():
        if request.method == 'GET':
            return render_template('denglu.html')
        else:
            username = request.form.get('username')
            password = request.form.get('password')
            user = User.query.filter(User.username == username).first()
            if user:
                if user.password == password:
                    session['user']=username
                    session.permanent = True
                    return redirect(url_for('home'))
                else:
                    return 'password error'
            else:
                return 'username is not existed.'
    
    
    @app.route('/sign_up/',methods=['GET','POST'])
    def sign_up():
        if request.method == 'GET':
            return render_template('zhuce.html')
        else:
            username = request.form.get('username')
            password = request.form.get('password')
            user = User.query.filter(User.username == username).first()
            if user:
                return 'username existed.'
            else:
                user1 = User(username=username, password=password)
                db.session.add(user1)
                db.session.commit()
                return redirect(url_for('home'))
    
    @app.context_processor
    def mycontext():
        username=session.get('user')
        if username:
            return {'username':username}
        else:
            return {}
    @app.route('/logout/') #注销
    def logout():
        session.clear()
        return redirect(url_for('home'))
    
    def loginFirst(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            if session.get('user'):
                return func(*args, **kwargs)
            else:
                return redirect(url_for('sign_in'))
        return wrapper
    
    @app.route('/question/',methods=['GET','POST'])
    @loginFirst
    def question():
        if request.method == 'GET':
            return render_template('question.html')
        else:
            title = request.form.get('title')
            detail = request.form.get('detail')
            authorID =User.query.filter(User.username == session.get('user')).first().id
            user = User.query.filter(User.username == session.get('user')).first()
            question = Question.query.filter(Question.title == title).first()
            if question:
                return 'question existed'
            else:
                questions = Question(title=title, detail=detail, authorID=authorID)
                questions.author = user
                db.session.add(questions)
                db.session.commit()
                return redirect(url_for(('home')))
    
    if __name__ == '__main__':
        app.run(debug=True)

     

  5.  尝试实现发布评论

  6.  

     

posted on 2017-12-06 22:57  106洪瑜  阅读(214)  评论(0编辑  收藏  举报