Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义具有ListField且不能为空的mongoengine模型_Python_Flask_Mongoengine_Wtforms - Fatal编程技术网

Python 定义具有ListField且不能为空的mongoengine模型

Python 定义具有ListField且不能为空的mongoengine模型,python,flask,mongoengine,wtforms,Python,Flask,Mongoengine,Wtforms,我使用的是flask mongoengine,我的型号Post有title、slug、body和标签。每个Post都有一个唯一的slug,每个Post至少需要一个标签。因此标记是一个列表,包含字符串,至少包含1个元素 class Post(db.Document): created_at = db.DateTimeField(default=datetime.datetime.now, required=True) title = db.StringField(max_lengt

我使用的是flask mongoengine,我的型号
Post
title
slug
body
标签。每个
Post
都有一个唯一的
slug
,每个
Post
至少需要一个标签。因此
标记
是一个
列表
,包含
字符串
,至少包含1个元素

class Post(db.Document):
    created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
    title = db.StringField(max_length=255, required=True)
    slug = db.StringField(max_length=255, required=True, unique=True)
    body = db.StringField(required=True)
    tags = db.ListField(db.StringField(max_length=255), required=True)   #each post should have at least one tag

    def get_absolute_url(self):
        return url_for('post', kwargs={"slug": self.slug})

    def __unicode__(self):
        return self.title

    meta = {
        'allow_inheritance': False,
        'indexes': ['-created_at', 'slug', 'title', 'tags'],
        'ordering': ['-created_at'],
        'collection': 'posts',
    }
当我在模板中创建一个表单以输入新帖子时,每个标签都被输入到一个新的文本框中,并带有名称
标签
,因此如果我有3个标签用于
帖子
,那么将有3个文本框,每个文本框都带有名称
标签
下面是视图的显示方式

from flask.ext.mongoengine.wtf import model_form
class CreateEdit(MethodView):

    form = model_form(Post)    #Gets object of class PostForm which is a subclass of ModelForm, ModelForm is a subclass of Form
    def post(self, slug = None):
        form = self.form(request.form)   #Populate PostForm with data from the request
        post = Post()
        form.populate_obj(post)
        post.save()
        flash('Update successful')
现在我在浏览器中看到一个
mongoengine.base.ValidationError
错误。 我在post请求中传递的数据(提供:Firebug)

当我在调试器中检查时
request.form
显示

werkzeug.datastructures.ImmutableMultiDict({'body': u'this is the 3rd post    \r\n  ', 'title': u'third post', 'slug': u'3rd', 'tags': u'third'})
现在表单中有多个
标记,但字典中只有一个标记。这没关系,因为它是一个字典,所以不能有多个同名键。但是当我检查
form.data
时,它会显示

{'body': u'this is the 3rd post    \r\n  ', 'title': u'third post', 'created_at': datetime.datetime(2012, 12, 24, 14, 7, 18, 97273), 'tags': [], 'slug': u'3rd'  }
tags
字段是一个空列表,这很荒谬,因为它应该由
request.form
中的
tags
填充。另外,如果我在调试器中输入
print request.form
,我会得到

ImmutableMultiDict([('body', u'this is the 3rd post    \r\n  '), ('title', u'third post'), ('slug', u'3rd'), ('tags', u'third'), ('tags', u'last')])
因此,这意味着
请求
对象为同一名称保留多个值以在表示中显示(
\uuuu repr\uuuu
),但只将一个值传递给
模型形式
对象。但是我的
ModelForm
没有为
标记获取任何值

怎么了?

你的代码对我有用

Werkzeug使用的MultiDict可以包含多个同名键

当我尝试使用相同名称的3个输入字段并在调试器中检查request.form时,我得到:
ImmutableMultiDict([('tag',u'1'),('tag',u'2'),('tag',u'3'))

并且可以使用
request.form.getlist('tag')获取值


可能是因为flask/werkzeug的旧版本吗?

请原谅我的无知,但我以前从未使用过WTForms。与
列表字段
?@AlexL否不同。它们是相同的。看见在
支持的字段中
部分,我使用的是Flask
0.9
和Werkezeug
0.8.3
。您正在运行哪个版本?
ImmutableMultiDict([('body', u'this is the 3rd post    \r\n  '), ('title', u'third post'), ('slug', u'3rd'), ('tags', u'third'), ('tags', u'last')])