2015-12-08 6 views
1

На основе 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. Может ли кто-нибудь понять, что там не так?

ответ

5

Edit:

В соответствии с комментарием # 2 пользователем Жером, текущей версии (0.7.5 на данный момент этого редактирования) из опоки-mongoengine (и mongoengine 0.10.5) работает прямо из коробка. Протестировано и проверено.

Я делаю то же учебное пособие и столкнулся с этой ошибкой.

Я добавил help_text="Your helptext here." в поля (это StringFields) в models.py, и это решило проблему, но ваша ошибка указывает на ObjectIdField, что делает ее намного более загадочной.

Так что это не очень полезно, но, возможно, это вдохновит вас в правильном направлении.

Edit:

Я боролся с этим на некоторое время больше, и оказывается там произошли изменения в mongoengine, что сломал flask_mongoengine. This commit in flask_mongoengine in turn fixes that.

Что касается реальных решений, то для меня работала предыдущая версия mongoengine (0.10.1). Таким образом:

$ pip uninstall mongoengine 
$ pip install mongoengine==0.10.1 
+0

Это определенно сломал flask_mongoengine. Я попытался добавить help_text во все мои поля, он жалуется, что скрытый файл '_cls' также нуждается в этом help_text. Я вернул mongoengine к версии, которую вы указали как обходной путь. Благодаря! – douglaslps

+1

Конец, упомянутый выше, включен в колбу-монгоингин 0.7.5, поэтому использование последних версий MongoEngine и flask-mongengine должно работать нормально. –

1

Текущая версия Flask-MongoEngine 0.7.5 устраняет эту проблему.

Он исправляет ошибки MongoEngine help_text и safe.

Обновите существующую версию Flask-MongoEngine, используя pip install --upgrade flask-mongoengine.