Mat*_*ati 5 python wtforms flask-mongoengine
Hy大家,我正在实现一个Flask/MongoDB项目,因为我是这个世界的新手,我已经按照本页的教程:http: //docs.mongodb.org/ecosystem/tutorial/write-a-tumblelog -application与-烧瓶-mongoengine /
之后,我开始编写自己的应用程序代码,这是代码的一部分:
楷模:
class Generic(db.Document):
descrizione = db.StringField(max_length=255, required=True)
meta = {
'allow_inheritance': True,
'indexes': [
{'fields': ['descrizione'], 'unique': True}
]
}
class Category(Generic):
def __call__(self, *args):
pass
class User(db.Document):
email = db.EmailField(max_length=255, required=True)
nickname = db.StringField(max_length=255, required=True)
password = db.StringField(max_length=16, required=True)
categoria = db.ReferenceField('Category', required=True)
meta = {
'indexes': [
{'fields': ['nickname', 'email'], 'unique': True}
]
}
Run Code Online (Sandbox Code Playgroud)
如上所示,我有一个继承"Generic"类的"Category"类."User"类最后有一个ReferenceField属于Category.这样,当我创建用户时,mongo db上的category字段存储为ObjectID,与"generic"集合相关,该集合具有我创建的所有类别.
下一步是创建表单以将新文档插入到用户集合中.在我的Views python文件中我有这个cose:
def iscrizione():
form = model_form(User, only=['email', 'nickname', 'password', 'categoria'])(request.form)
if request.method == 'GET':
ctx = {
'form': form
}
return render_template('users/iscrizione.html', **ctx)
Run Code Online (Sandbox Code Playgroud)
该模板使用教程页面中报告的Jinja宏:
{% macro render(form) -%}
<fieldset>
{% for field in form %}
{% if field.type in ['CSRFTokenField', 'HiddenField'] %}
{{ field() }}
{% else %}
<div class="clearfix {% if field.errors %}error{% endif %}">
{{ field.label }}
<div class="input">
{% if field.name == "body" %}
{{ field(rows=10, cols=40) }}
{% else %}
{{ field() }}
{% endif %}
{% if field.errors or field.help_text %}
<span class="help-inline">
{% if field.errors %}
{{ field.errors|join(' ') }}
{% else %}
{{ field.help_text }}
{% endif %}
</span>
{% endif %}
</div>
</div>
{% endif %}
{% endfor %}
</fieldset>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
最后,这是我的问题 (如果你已经达到了这个文本,你就是我的英雄)
当我使用呈现的表单访问网页时,宏正确显示文本字段,而对于我的模型中的ReferenceField,它显示一个组合框.select组合中的选项值与我创建的类别文档的对象ID完全对齐.选择其中一个并提交表单,我的应用程序正确创建新的用户文档.
不幸的是,选择框标签没有显示人类可读的值,报告"类别对象".
<select id="categoria" name="categoria">
<option value="530536363c74031c24ee7ab6">Category object</option>
<option value="5305362d3c74031c24ee7ab5">Category object</option>
<option value="530535793c74031b73dd07b4">Category object</option>
</select>
Run Code Online (Sandbox Code Playgroud)
如何设置为选择框显示正确的标签?
我终于成功了!假设用户文档的“categoria”字段是“Category”集合的 ReferenceField。只需使用您想要作为标签的类别模型的字段名称将“label_attr”属性添加到“form.categoria”即可。
def iscrizione():
form = model_form(User, only=['email', 'nickname', 'password', 'categoria'])(request.form)
form.categoria.label_attr='descrizione' #<< add this line
if request.method == 'GET':
ctx = {
'form': form
}
return render_template('users/iscrizione.html', **ctx)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1888 次 |
| 最近记录: |