I-Kolben-mongoengine und mein Modell bin mit Post
Felder hat title
, slug
, body
und tags
. Jede Post
hat eine eindeutige slug
und jede Post
muss mindestens 1 Tag haben. So ist tags
ein list
von strings
mit mindestens 1 Element.Definition eines mongoengine Modell mit Listfield, die nicht leer sein
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',
}
, wenn ich ein Formular in der Vorlage zu erstellen, um einen neuen Beitrags Eingabe wird jeder Tag in einem neuen Textfeld mit dem Namen eingegeben tags
also, wenn ich habe 3-Tags für ein Post
dann gäbe es drei Textfelder sein mit von denen jeder Name tags
Hier ist, wie die Ansicht
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')
Jetzt i einen mongoengine.base.ValidationError
Fehler im Browser erhalten. Die Daten, die ich in der Post-Anforderung übergeben (mit freundlicher Genehmigung: Firebug)
title: third post
slug: 3rd
body: this is the 3rd post
tags: third
tags: last
Wenn i in dem Debugger inspizierten request.form
zeigt
werkzeug.datastructures.ImmutableMultiDict({'body': u'this is the 3rd post \r\n ', 'title': u'third post', 'slug': u'3rd', 'tags': u'third'})
jetzt gibt es mehrere tags
in der Form, sondern nur eine vorhanden ist, im Wörterbuch. Dies ist OK, weil es ein Wörterbuch ist, so dass es nicht mehrere Schlüssel mit demselben Namen geben kann. Aber wenn ich form.data
inspizieren zeigt es
{'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' }
das tags
Feld eine leere Liste ist, die absurd ist, weil es mit tags
von request.form
bevölkert werden soll. Auch wenn ich print request.form
im Debugger eingeben i erhalten
ImmutableMultiDict([('body', u'this is the 3rd post \r\n '), ('title', u'third post'), ('slug', u'3rd'), ('tags', u'third'), ('tags', u'last')])
So bedeutet das request
Objekt mehrere Werte für den gleichen Namen in der Darstellung zu zeigen, behält (__repr__
), sondern geht nur ein Wert an das ModelForm
Objekt. Aber mein ModelForm
bekommt keinen Wert für tags
.
Was ist los?
Verzeihen Sie meine Ignoranz, aber ich habe WTForms noch nie zuvor verwendet. Ist eine [FieldList] (http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList) anders als eine 'ListField'? –
@AlexL Nein. Sie sind gleich. Siehe [hier] (https://flask-mongoengine.readthedocs.org/en/latest/). Im Abschnitt 'Unterstützte Felder' – lovesh