我想要实现的目标:
我正在尝试从头开始构建一个非常简单的管理界面,它将文本字段和图像存储在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>
答案 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上看到的那样你的帖子显示在编辑框下面直播。