flask,pymongo,forms - 将pymongo数据加载到表单中进行编辑

时间:2016-07-13 15:07:56

标签: python flask pymongo wtforms flask-wtforms

我想要实现的目标:

我正在尝试从头开始构建一个非常简单的管理界面,它将文本字段和图像存储在mongodb中。然后,用户可以登录并对站点内容进行少量更改。

我的问题以及我认为我感到困惑的地方:

是否可以在pymongo中生成具有现有db记录的表单(因此可以在db中编辑和更新它们)?在试图理解这个问题之后,我认为我的困惑在于我是否可以直接使用WTForms和pymongo,或者我是否需要使用基于对象的映射器,例如MongoEngine。

这是我的烧瓶应用程序:

app = Flask(__name__)
# define the mongo connection
app.config['DB_HOST'] = 'mongodb://localhost/'
app.config['DB_PORT'] = 27017
app.config['DB_DBNAME'] = 'my_db'
the_db = PyMongo(app, config_prefix='DB')

#others routes here...

@app.route("/admin/")
def dashboard():
    pages = list(the_db.db.pages.find({}))
    return render_template('admin.html', pages=pages)

@app.route('/admin/update', methods=['POST'])
def update():
    updated = datetime.datetime.utcnow()
    page = request.form['page_name']
    header = request.form['header']
    body = request.form['body']

    h_db.db.pages.update_one(
        {'page': page},
        {'$set':
            {
                'updated': updated,
                'header': header,
                'body': body
            }
        }, upsert=True)

    pages = list(the_db({}))
    return render_template('admin.html', pages=pages)

以下是模板:

{% for i in pages %}
    {{ i.page }}<br>
{% endfor %}


{% from "_formhelpers.html" import render_field %}
<form action="/admin/update" autocomplete="on" method="POST">
    {{ render_field(form.username) }}
    <input type="text" name="page_name" /><br/>
    <input type="text" name="header" /><br/>
    <input type="TextAreaField" name="body" /><br/>
    <input type="submit" name="submit" /><br/>
</form>

1 个答案:

答案 0 :(得分:0)

这其实很简单。如果您查看表单的HTML文档,那么您会发现您可以执行以下操作:

  <input type="text" name="firstname" value="Mickey"><br>

和&#34;米奇&#34;将以适合您的形式出现。因此,您需要做的就是在服务器代码中声明变量,该变量保存来自您对路径的mongodb调用的值,然后将它们传递给模板,就像使用&#34; pages&#34;然后在前端你可以使用Jinja中的嵌入式python动态渲染它,如:

@app.route("/admin/<int:page>")
def dashboard(page):
    pages = the_db.db.pages.find({page})
    for p in pages:
        page_name = [p['page']]
        header = [p['header']]
        body = [p['body']]
    return render_template('admin.html', page_name=page_name, header=header, body=body)

然后你可以使用你的模板并嵌入:

<form action="/admin/update" autocomplete="on" method="POST">
    {{ render_field(form.username) }}
    <input type="text" name="page_name" value={{ page_name|string }}/><br/>
    <input type="text" name="header" value={{ header|string }}/><br/>
    <input type="TextAreaField" name="body" value={{ body|string }}/><br/>
    <input type="submit" name="submit" /><br/>
</form>

我不是WTForms专家,所以我可能会绕过它提供的一些助手,但大部分基础都在这里。总结:

您需要解析MongoDB文档的元素并将它们传递给模板。您可以使用Jinja的功能将这些值动态地呈现在前端的适当位置,如HTML标准所述(&#34;值&#34;元素中的占位符)。这将为您提供最基本的功能。

如果你想得到想象,你可以看一下AngularJS来处理前端MVC,你可以在提交之前动态可视化你的编辑......有点像你在SO.com上看到的那样你的帖子显示在编辑框下面直播。