【问题标题】:How to pass information from html(jinja) to python(flask) through a form如何通过表单将信息从 html(jinja) 传递到 python(flask)
【发布时间】:2015-06-28 19:21:20
【问题描述】:

我正在尝试在 The Flask Mega-Tutorial 的博客中添加评论帖子的可能性(使用新帖子作为评论)。我的问题与数据库无关。我不知道如何将表单“链接”到父帖子,以便 cmets 参考他们的父母。

这里有一些代码...

观点:

@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 = PostForm()
    if form.validate_on_submit():
        post = Post(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'))
    posts = g.user.followed_posts().paginate(page, POSTS_PER_PAGE, False)
    return render_template('index.html',
                           title='Home',
                           form=form,
                           posts=posts)

形式:

class PostForm(Form):
    post = StringField('post', validators=[DataRequired()])

index.html 部分(post 和 form 在同一行...)

{% for post in posts.items %}
<table>
    <tr valign="top">
        <td><img src="{{ post.author.avatar(50) }}"></td><td><p><a href="{{ url_for('user', nickname=post.author.nickname)}}">{{ post.author.nickname }}</a> said {{ momentjs(post.timestamp).fromNow() }}:</p>
<p><strong>{{ post.body }}</strong></p></td>
       </tr>
       <tr>
         <form action="" method="post" name="post">
         {{form.hidden_tag() }}
         <table>
           <tr>
             <td> <p>------------- </p> </td>
             <td>{{ form.post(size=10, maxlength=140)}}</td>
             <td>
             {% for error in form.post.errors %}
             <span> style="color: red;"[{{error}}] </span><br>
             {% endfor %}
             </td>
             <td><input type="submit" value="Reply!"></td>
         </table>
         </form>
      </tr>
</table>
{% endfor %}

Post 的数据库模型:

class Post(db.Model):
    __searchable__ = ['body']

    id = db.Column(db.Integer, primary_key = True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    parent_id = db.Column(db.Integer, db.ForeignKey('post.id'))
    children = db.relationship("Post")

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

我的想法是添加一个新帖子作为“评论”,为其提供对旧帖子 (parent_id) 的数据库引用。如何配置表单以便知道谁是父母(parent_id)?我应该在 index.html 上工作并找到一种方法向表单提供有关父帖子的信息吗?

非常感谢!

【问题讨论】:

标签: python forms flask flask-wtforms


【解决方案1】:

从技术上讲,您不应该在一个页面上有多个相同表单的实例,但是……您可以使用 HiddenField 自动填写父帖子的 ID。

在你的 PostForm 类中,添加一个 HiddenField(记得导入它:from wtforms import HiddenField):

class PostForm(Form):
    post = StringField('post', validators=[DataRequired()])
    parentID = HiddenField('', validators=[DataRequired()])

在您的模板中添加form 标签中的任意位置:{{ field(value=post.id) }}

在您的 validate 方法中,将父 ID 添加到 post 类的实例的创建中:

def index(page=1):
    form = PostForm()
        if form.validate_on_submit():
            post = Post(body=form.post.data, parent_id=form.parentID.data, timestamp=datetime.utcnow(),author=g.user)

【讨论】:

  • 非常感谢!我想到了 hiddenfield,但我没有找到如何使用 '{{ field(value=post.id)' 来结束为什么我不应该在一页上有多个相同表单的实例?获得相同结果的更好方法是什么? (许多网站在同一页面中有多种形式,例如 facebook)。再次感谢!
  • 我猜你是对的,我想不出更好的方法来设置它,WTForms 会自动分隔表单的每个实例,所以你应该很好!
猜你喜欢
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多