2012-12-24 12 views
5

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

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

+0

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

+0

@AlexL Nein. Sie sind gleich. Siehe [hier] (https://flask-mongoengine.readthedocs.org/en/latest/). Im Abschnitt 'Unterstützte Felder' – lovesh

Antwort

0

Ihr Code funktioniert für mich

Werkzeug ein MultiDict verwendet, die mehrere Schlüssel mit dem gleichen Namen http://werkzeug.pocoo.org/docs/datastructures/

Wenn ich versuche, 3 Eingabefelder mit dem gleichen Namen und inspizieren request.form im Debugger enthalten i erhalten: ImmutableMultiDict([('tag', u'1'), ('tag', u'2'), ('tag', u'3')])

und können die Werte mit request.form.getlist('tag')

Könnte es aufgrund einer alten Version von Kolben/Werkzeug sein bekommen?

+0

verwende ich Flask' ​​0.9' und Werkzeug '0.8.3'. Welche Version laufen Sie? – lovesh