2012-12-24 28 views
5

Używam skrzynkowego mongoengine i mój model Post ma pola title, slug, body i tags. Każdy numer Post ma unikalny numer slug, a każdy kod Post musi mieć co najmniej 1 znacznik. Więc tags jest list z strings z co najmniej 1 elementem.określające model mongoengine z ListField że nie może być pusta

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', 
    } 

kiedy utworzyć formularz w szablonie do wprowadzania nowego posta, każdy znacznik jest wpisana w nowym polu tekstowym o nazwie tags więc jeśli mam 3 znaczniki Przez Post wtedy nie byłoby 3 pola tekstowe z każda ma nazwę tags Oto jak widok jest

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

teraz pojawia się błąd mongoengine.base.ValidationError w przeglądarce. Dane, które przechodzę w POST (dzięki uprzejmości: Firebug)

title: third post 
slug: 3rd 
body: this is the 3rd post 
tags: third 
tags: last 

Kiedy kontrolowane w debugera request.form przedstawia

werkzeug.datastructures.ImmutableMultiDict({'body': u'this is the 3rd post \r\n ', 'title': u'third post', 'slug': u'3rd', 'tags': u'third'}) 

obecnie istnieje wiele tags w formie, ale tylko jeden jest obecny w słowniku. To jest OK, ponieważ jest to słownik, więc nie może być wielu kluczy o tej samej nazwie. Ale kiedy sprawdzać form.data pokazuje

{'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' } 

pole tags jest pusta lista co jest absurdem, ponieważ powinna ona być wypełniona tags z request.form. Także jeśli wejdę print request.form w debugera i uzyskać

ImmutableMultiDict([('body', u'this is the 3rd post \r\n '), ('title', u'third post'), ('slug', u'3rd'), ('tags', u'third'), ('tags', u'last')]) 

Więc to oznacza, że ​​obiekt request zachowuje wiele wartości dla tej samej nazwie, aby zobaczyć go w reprezentacji (__repr__), ale przechodzi tylko jedna wartość przedmiotu ModelForm. Ale mój ModelForm nie otrzymuje żadnej wartości dla tags.

Co jest nie tak?

+0

Przebaczam moją ignorancję, ale wcześniej nie używałem WTForms. Czy [FieldList] (http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList) różni się od 'ListField'? –

+0

@AlexL Nie. Są takie same. Zobacz [tutaj] (https://flask-mongoengine.readthedocs.org/en/latest/). W sekcji "Obsługiwane pola" – lovesh

Odpowiedz

0

Twój kod działa dla mnie

Werkzeug używa MultiDict który może zawierać wiele kluczy o tej samej nazwie http://werkzeug.pocoo.org/docs/datastructures/

Kiedy próbuję 3 pól wejściowych o tej samej nazwie i sprawdź Request.Form w debugera i otrzymujemy: ImmutableMultiDict([('tag', u'1'), ('tag', u'2'), ('tag', u'3')])

i można uzyskać wartości z request.form.getlist('tag')

to może być ze względu na starej wersji kolby/Werkzeug?

+0

używam Flask '0.9' i Werkezeug' 0.8.3'. Którą wersję używasz? – lovesh

Powiązane problemy