2015-06-21 17 views
1

我正在烧瓶中开发一个博客应用程序。在显示帖子的html文件中有注释选项。但在提交表单时,我无法检索与评论表单相对应的ORM对象'post'。 我的index.html文件:如何在烧瓶中提交表单时检索范围内的ORM对象

{% extends "base.html" %} 
{% block content %} 


    <h1>Hi, {{ g.user.nickname }}!</h1> 
    <form action="" method="post" name="post"> 
     {{ form.hidden_tag() }} 
     <table> 
      <tr> 
       <td>Say something:</td> 
      </tr> 
     <tr> 
       <td>Title</td> 
       <td>{{ form.title(size=30, maxlength=140) }}</td> 
       <td> 
       {% for error in form.title.errors %} 
       <span style="color: red;">[{{ error }}]</span><br> 
       {% endfor %} 
       </td> 
      </tr> 

     <tr> 
       <td>Content</td> 
       <td>{{ form.post(size=30, maxlength=2000) }}</td> 
       <td> 
       {% for error in form.post.errors %} 
       <span style="color: red;">[{{ error }}]</span><br> 
       {% endfor %} 
       </td> 
      </tr> 

      <tr> 
       <td></td> 
       <td><input type="submit" name="btn" value="Post!"></td> 
       <td></td> 
      </tr> 
     </table> 
    </form> 


    {% for post in posts.items %} 
    <div class="{{ post.id }}"> 

     <div> 
      {% include 'post.html' %} 
     </div> 
     <hr> 
     <div class="row-fluid"> 
     <div class="span11 offset1"> 
      <div class="comments"> 
       {% if post.comments %} 
        <p> 
        {% for comment in post.comments %} 
         <p><i>{{ comment.name }}</i>: {{ comment.body }}</p> 
        {% endfor %} 
        </p> 
       {% endif %} 
      </div> 
     </div> 
     </div> 

     <div> 
     <form action="" method="post" name="post"> 
       {{ form.hidden_tag() }} 
     <input type="hidden" name="p_id" value="{{post}}"> 
      <table> 
       <tr> 
         <td>Add a comment:</td> 
       </tr> 
      <tr> 
         <td>Name</td> 
         <td>{{ form.title(size=30, maxlength=40) }}</td> 
         <td> 
          {% for error in form.title.errors %} 
           <span style="color: red;">[{{ error }}]</span><br> 
          {% endfor %} 
         </td> 
       </tr> 

      <tr> 
         <td>Comment</td> 
         <td>{{ form.post(size=30, maxlength=140) }}</td> 
         <td> 
          {% for error in form.post.errors %} 
           <span style="color: red;">[{{ error }}]</span><br> 
          {% endfor %} 
         </td> 
       </tr> 

       <tr> 
         <td></td> 
         <td><input type="submit" name="btn" value="Comment"></td> 
         <td></td> 
       </tr> 
      </table> 
      </form> 
     </div> 

    </div> 
    {% endfor %} 


    {% if posts.has_prev %}<a href="{{ url_for('index', page=posts.prev_num) }}">&lt;&lt; Newer posts</a>{% else %}&lt;&lt; Newer posts{% endif %} | 
{% if posts.has_next %}<a href="{{ url_for('index', page=posts.next_num) }}">Older posts &gt;&gt;</a>{% else %}Older posts &gt;&gt;{% endif %} 

{% endblock %} 

,并查看文件中有这样的:

@app.route('/', methods=['GET', 'POST']) 
@app.route('/index', methods=['GET', 'POST']) 
@app.route('/index/<int:page>', methods=['GET', 'POST']) 
@login_required 
def index(page=1): 
    form = PostnCommentForm() 
    if form.validate_on_submit(): 
     if request.form['btn'] == 'Post!': 
     post = Post(title=form.title.data, body=form.post.data, timestamp=datetime.utcnow(), author=g.user) 
     db.session.add(post) 
     db.session.commit() 
     flash('Your post is now live!') 
     return redirect(url_for('index')) 
     else:  
     comment = Comment(name=form.title.data, body=form.post.data, timestamp=datetime.utcnow(), parent_post=form.p_id.data) 
     db.session.add(comment) 
     db.session.commit() 
     flash('Your comment is now live!') 
     return redirect(url_for('index')) 
    posts = g.user.blog_posts().paginate(page, POSTS_PER_PAGE, False) 
    return render_template('index.html', 
          title='Home', 
          form=form, 
          posts=posts) 

型号:

class Post(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    title = db.Column(db.String(140)) 
    body = db.Column(db.String(2000)) 
    timestamp = db.Column(db.DateTime) 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 
    comments = db.relationship('Comment', backref='parent_post', lazy='dynamic') 

    def __repr__(self): 
     return '<Post %r>' % (self.body) 

class Comment(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    name = db.Column(db.String(40)) 
    body = db.Column(db.String(140)) 
    timestamp = db.Column(db.DateTime) 
    post_id = db.Column(db.Integer, db.ForeignKey('post.id')) 

Form.py文件:

from flask.ext.wtf import Form 
from wtforms import StringField, BooleanField, TextAreaField, IntegerField 
from wtforms.validators import DataRequired, Length 
from app.models import User 

class PostnCommentForm(Form): 
post = StringField('post', validators=[DataRequired()]) 
title = StringField('title', validators=[DataRequired()]) 
p_id= IntegerField('p_id') 

回答

1

如果您已经有post_id作为隐藏领域,那么检索它有什么问题。

你可以找回

comment = Comment(name=form.title.data, body=form.post.data, timestamp=datetime.utcnow(),title = form.post_id.data) 

我想建议post_id = form.post_id.data代替title = form.post_id.data

+0

哦,谢谢。实际上,当我尝试一些在线教程时,隐藏字段出现在代码中。我没有想法如何使用隐藏字段 –

+0

我希望现在你能够检索**'post_id' **。谢谢。 –

+0

它应该有一个你已经提到的INTEGER类型。所以它应该完美地工作。您需要发布完整的代码,以便我可以真正了解这一点。 –

相关问题