2012-12-24 5 views
5

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 liststrings'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 bir Post 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

+0

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? –

+0

@AlexL Hayır. Aynı. Bakınız [burada] (https://flask-mongoengine.readthedocs.org/en/latest/). 'Desteklenen alanlar' bölümünde – lovesh

cevap

0

Kişisel Kod çalışır i ImmutableMultiDict([('tag', u'1'), ('tag', u'2'), ('tag', u'3')])

nedeniyle balon/Werkzeug eski sürümüne request.form.getlist('tag')

burada olman ile değerler elde edebilirsiniz: get?

+0

Flask '0.9' ve Werkezeug' 0.8.3' kullanıyorum. Hangi sürümü kullanıyorsunuz? – lovesh

İlgili konular