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?
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'? –
@AlexL Nie. Są takie same. Zobacz [tutaj] (https://flask-mongoengine.readthedocs.org/en/latest/). W sekcji "Obsługiwane pola" – lovesh