На основе this учебника Я пытаюсь создать форму, чтобы получить несколько измерений. Кажется, что часть для отображения данных работают, но при использовании команды model_form
для создания формы ввода он порывает с этой ошибкой:python wtf AttributeError: объект ObjectIdField не имеет атрибута 'help_text'
File "/myproject/lib/python3.4/site-packages/flask_mongoengine/wtf/orm.py", line 49, in convert 'description': field.help_text or '',
AttributeError: 'ObjectIdField' object has no attribute 'help_text'
ошибка происходит на этой линии моего кода:
form_cls = model_form(Measurement, exclude=('id', 'created_at', 'comments'))
Это мой view.py код:
from flask import Blueprint, request, redirect, render_template, url_for
from flask.views import MethodView
from flask.ext.mongoengine.wtf import model_form
from pyReefLog.models import Measurement
measurements = Blueprint('measurements', __name__, template_folder='templates')
class List(MethodView):
cls = Measurement
def get(self):
measurements = self.cls.objects.all()
return render_template('measurements/list.html', measurements=measurements)
class Detail(MethodView):
def get_context(self, creator=None):
form_cls = model_form(Measurement, exclude=('id', 'created_at', 'comments'))
if creator:
measurement = Measurement.objects.get_or_404(creator=creator)
if request.method == 'POST':
form = form_cls(request.form, inital=measurement._data)
else:
form = form_cls(obj=measurement)
else:
measurement = Measurement()
form = form_cls(request.form)
context = {
"measurement": measurement,
"form": form,
"create": creator is None
}
return context
def get(self, creator):
context = self.get_context(creator)
return render_template('measurements/detail.html', **context)
def post(self, creator):
context = self.get_context(creator)
form = context.get('form')
if form.validate():
post = context.get('post')
form.populate_obj(post)
post.save()
return redirect(url_for('measurements.index'))
return render_template('measurements/detail.html', **context)
# Register the urls
measurements.add_url_rule('/', view_func=List.as_view('index'))
measurements.add_url_rule('/create/', defaults={'creator': None}, view_func=Detail.as_view('create'))
measurements.add_url_rule('/<creator>/', view_func=Detail.as_view('edit'))
И это мой models.py:
import datetime
from flask import url_for
from pyReefLog import db
class Comment(db.EmbeddedDocument):
created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
body = db.StringField(verbose_name="Comment", required=True)
author = db.StringField(verbose_name="Name", max_length=255, required=True)
class Measurement(db.Document):
created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
measured_at = db.DateTimeField(default=datetime.datetime.now, required=True)
alkalinity = db.DecimalField(default=0.0, precision=2)
calcium = db.DecimalField(default=0.0, precision=2)
magnesium = db.DecimalField(default=0.0, precision=2)
ph = db.DecimalField(default=0.0, precision=2)
phosphate = db.DecimalField(default=0.0, precision=2)
salinity = db.DecimalField(default=0.0, precision=2)
temperature = db.DecimalField(default=0.0, precision=2)
creator = db.StringField(required=True, max_length=255)
comments = db.ListField(db.EmbeddedDocumentField('Comment'))
def get_absolute_url(self):
return url_for('measurement', kwargs={"creator": self.creator})
def __unicode__(self):
return self.creator
meta = {
'allow_inheritance': True,
'indexes': ['-created_at', '-measured_at', 'creator'],
'ordering': ['-measured_at']
}
Ни один из руководства wtForms не упоминает ничего, связанного с атрибутом help_text. Может ли кто-нибудь понять, что там не так?
Это определенно сломал flask_mongoengine. Я попытался добавить help_text во все мои поля, он жалуется, что скрытый файл '_cls' также нуждается в этом help_text. Я вернул mongoengine к версии, которую вы указали как обходной путь. Благодаря! – douglaslps
Конец, упомянутый выше, включен в колбу-монгоингин 0.7.5, поэтому использование последних версий MongoEngine и flask-mongengine должно работать нормально. –