boş olamaz ListField ile mongoengine modelini tanımlayan. Her Post
, benzersiz bir slug
'a sahiptir ve her Post
, en az 1 etikete sahip olmalıdır. Bu nedenle tags
, en az 1 elemanlı bir list
strings
'dur. Ben alanları <code>title</code>, <code>slug</code>, <code>body</code> ve <code>tags</code> sahiptir <code>Post</code> şişesi-mongoengine ve benim modeli kullanıyorum
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',
}
i yeni bir yazı girmek için şablonunda bir form oluşturmak
, her etiket ı daha sonra 3 metin kutuları olurdu birPost
için 3 etiketlerine sahip öyleyse adıyla
tags
ile yeni bir metin kutusuna girilir görünüm
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')
Şimdi ben tarayıcıda bir
mongoengine.base.ValidationError
hatası alıyorum ne kadar Aşağıda her haiz adı
tags
olduğunu. i sonrası isteğe geçmek verileri (izniyle: Firebug'ın) i hata ayıklayıcı
request.form
muayene
title: third post
slug: 3rd
body: this is the 3rd post
tags: third
tags: last
hemen şeklinde tags
birden vardır, ancak sadece biri mevcuttur
werkzeug.datastructures.ImmutableMultiDict({'body': u'this is the 3rd post \r\n ', 'title': u'third post', 'slug': u'3rd', 'tags': u'third'})
göstermektedir sözlükte. Bu, bir sözlük olduğundan, aynı ada sahip birden çok anahtar olamaz, çünkü Tamam. i form.data
incelemek Ama ne zaman
{'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
alan bu request.form
den tags
ile dolması gerekir çünkü saçma boş listedir gösterir. i ayıklayıcısında print request.form
girerseniz Ayrıca ben
ImmutableMultiDict([('body', u'this is the 3rd post \r\n '), ('title', u'third post'), ('slug', u'3rd'), ('tags', u'third'), ('tags', u'last')])
olsun Yani request
nesne temsilinin (__repr__
) bunu göstermek için aynı ad için birden fazla değer korur ama ModelForm
nesneye yalnızca bir değer geçer demektir. Ama benim ModelForm
benim tags
için herhangi bir değer almıyor.
Sorun nedir? Aynı adı taşıyan 3 giriş alanlarını denemek ve ayıklayıcısında Request.Form muayenesi sırasında bana
Werkzeug aynı adı http://werkzeug.pocoo.org/docs/datastructures/
ile birden fazla anahtarı içerebilir bir MultiDict kullanan için
Cehaletimi bağışla, ama daha önce WTForms kullanmamıştım. Bir [FieldList] (http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList) bir "ListField" 'a farklı mıdır? –
@AlexL Hayır. Aynı. Bakınız [burada] (https://flask-mongoengine.readthedocs.org/en/latest/). 'Desteklenen alanlar' bölümünde – lovesh