python wtf AttributeError:'ObjectIdField'对象没有属性'help_text' [英] python wtf AttributeError: 'ObjectIdField' object has no attribute 'help_text'

查看:878
本文介绍了python wtf AttributeError:'ObjectIdField'对象没有属性'help_text'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于这个教程我正在尝试创建一个表单来获得一些测量结果。似乎显示数据的部分正在工作,但是当使用 model_form 命令生成输入表单时,它会中断这个错误:


文件/myproject/lib/python3.4/site-packages/flask_mongoengine/wtf/orm.py,第49行,转换
'description': field.help_text或'',



AttributeError:'ObjectIdField'对象没有'help_text'属性

错误发生在我的代码的这一行:

  form_cls = model_form(Measurement,exclude = 'id','created_at','comments'))

这是我的view.py代码:

  from flask导入Blueprint,request,redirect,render_template,url_for flask.views中的
import MethodView
from flask.ext.mongoengine.wtf从pyReefLog.models导入model_form
导入测量

度量= Blueprint('measurements', __name__,template_folder ='templates')


class List(MethodView):
cls =测量

def get(self):
measurement = self.cls.objects.all()
return render_template('measurements / list.html',measurements = measurements)


class Detail(MethodView):
$ b $ def get_context(self,creator = None):
form_cls = model_form(Measurement,exclude =('id','created_at','comments'))

如果创建者:
measurement = Measurement.objects.get_or_404(creator = creator)
if request.method =='POST':
form = form_cls(request.form,inital = measurement。 ($)
其他:
form = form_cls(obj = measurement)
else:
measurement = Measurement()
form = form_cls(request.form)

context = {
measurement:measurement,
form:form,
create:creator是None
}
返回上下文

def get(self,creator):
context = self.get_context(creator)
return render_template('measurements / detail.html',** context)

def post(self,creator):
context = self.get_context (创建者)
form = context.get('form')

如果form.validate():
post = context.get('post')
form.populate_obj(post)
post.save()

return redirect(url_for('measurements.index'))
return render_template('measurements / detail.html', **上下文)


#注册网址
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> /',v iew_func = Detail.as_view('edit'))

这是我的models.py:

 导入日期时间$ b $从烧瓶导入url_for 
从pyReefLog导入数据库


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测量(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默认= 0.0,精度= 2)
calcium = db.DecimalField(默认= 0.0,精度= 2)
镁= db.DecimalField(默认= 0.0,精度= 2)
ph = db.DecimalField(default = 0.0,precision = 2)
phosphate = db.DecimalField(defau (默认= 0.0,精度= 2)
温度= db.DecimalField(默认= 0.0,精度= 2)
创建者= db.stringField(required = True,max_length = 255)
comments = db.ListField(db.EmbeddedDocumentField('Comment'))
$ b $ def get_absolute_url(self):
return url_for('measurement',kwargs = {creator:self.creator})

def __unicode __(self):
return self.creator

meta = {
'allow_inheritance':真,
'索引':['-created_at','-measured_at','creator'],
'ordered':['-measured_at']
}

wtForms教程没有提及与help_text属性相关的任何内容。
任何人都可以明白有什么不对吗?

根据用户Jérôme的评论#2,当前版本(编辑时为0.7.5)烧瓶-mongoengine(和mongoengine 0.10.5)直接从框。测试和验证。

我正在做同样的教程,也遇到了错误。



code> help_text =Your helptext here。到models.py中的字段(这些是字符串字段),并解决了这个问题,但是你的错误指向ObjectIdField,这使得它很多令人费解的。



所以这不是很有帮助,但也许它会激励你在正确的方向。编辑:



我为此苦苦挣扎了一阵子,结果发现mongoengine发生了变化,破坏了flask_mongoengine。 这个在flask_mongoengine中的提交反过来修复了这个问题。



至于实际的解决方案,使用以前版本的mongoengine(0.10.1)为我工作。所以:

  $ pip uninstall mongoengine 
$ pip install mongoengine == 0.10.1


Based on this tutorial I am trying to create a form to get a few measurements. It seems that the part to display the data is working but when using the model_form command to generate the input form it breaks with this error:

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'

The error happens on this line of my code:

form_cls = model_form(Measurement, exclude=('id', 'created_at', 'comments'))

This is my view.py code:

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'))

And this is my 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']
    }

None of the wtForms tutorial mention anything related to help_text attribute. Can anyone understand what is wrong there?

解决方案

Edit:

As per comment #2 by user Jérôme, the current version (0.7.5 at the moment of this edit) of flask-mongoengine (and mongoengine 0.10.5) works straight out of the box. Tested and verified.

I'm doing the same tutorial and encountered that error too.

I added help_text="Your helptext here." to the fields (these were StringFields) in models.py and that solved the issue, but your error points to ObjectIdField, and that makes it a lot more puzzling.

So this isn't horribly helpful, but maybe it'll inspire you in the right direction.

Edit:

I wrestled with this for a while more, and turns out there's been a change in mongoengine that broke flask_mongoengine. This commit in flask_mongoengine in turn fixes that.

As for actual solutions, using a previous version of mongoengine (0.10.1) worked for me. So:

$ pip uninstall mongoengine
$ pip install mongoengine==0.10.1

这篇关于python wtf AttributeError:'ObjectIdField'对象没有属性'help_text'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆