2012-12-24 35 views
5

मैं कुप्पी के mongoengine और अपने मॉडल Post क्षेत्रों title, slug, body और tags है उपयोग कर रहा हूँ नहीं किया जा सकता को परिभाषित। प्रत्येक Post में एक अद्वितीय slug है और प्रत्येक Post में कम से कम 1 टैग होना आवश्यक है। तो tags कम से कम 1 तत्व के साथ strings का list है।ListField के साथ एक mongoengine मॉडल है कि खाली

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

जब मैं एक नई पोस्ट में प्रवेश के लिए टेम्पलेट में एक फ़ॉर्म बनाने, प्रत्येक टैग नाम tags के साथ एक नया पाठ बॉक्स में दर्ज किया गया है, इसलिए यदि मैं एक Post के लिए 3 टैग नहीं है तो वहाँ के साथ 3 पाठ बॉक्स होगा प्रत्येक के नाम tags यहाँ कैसे दृश्य

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

अब मैं ब्राउज़र में एक mongoengine.base.ValidationError त्रुटि मिलती है। डेटा है कि मैं पोस्ट अनुरोध में पारित (सौजन्य: Firebug)

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

जब मैं डिबगर request.form में निरीक्षण से पता चलता

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

अब वहाँ के रूप में कई tags हैं, लेकिन केवल एक ही मौजूद है शब्दकोश में। यह ठीक है क्योंकि इसका एक शब्दकोश है इसलिए एक ही नाम के साथ कई कुंजी नहीं हो सकती हैं। लेकिन जब मैं का निरीक्षण form.data यह पता चलता है

{'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 क्षेत्र एक खाली सूची जो बेतुका है, क्योंकि यह request.form से tags साथ आबादी की जानी चाहिए। इसके अलावा अगर मैं डिबगर में print request.form दर्ज मैं मिल

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

तो इसका मतलब है request वस्तु एक ही नाम के लिए अनेक मान को बरकरार रखे हुए प्रतिनिधित्व (__repr__) में यह दिखाने के लिए लेकिन ModelForm वस्तु को केवल एक ही मूल्य से गुजरता है। लेकिन मेरे ModelForm को tags के लिए कोई मूल्य नहीं मिल रहा है।

क्या गलत है?

+0

मेरी अज्ञानता को क्षमा करें, लेकिन मैंने पहले WTForms का उपयोग नहीं किया है। क्या एक [फील्डलिस्ट] (http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList) 'ListField' से अलग है? –

+0

@AlexL सं। वे समान हैं। [यहां] देखें (https://flask-mongoengine.readthedocs.org/en/latest/)। 'समर्थित फ़ील्ड' अनुभाग में – lovesh

उत्तर

0

अपने कोड काम करता है मुझे

WERKZEUG जब मैं एक ही नाम के साथ 3 इनपुट फ़ील्ड कोशिश करते हैं और डीबगर में Request.Form का निरीक्षण एक MultiDict कि एक ही नाम http://werkzeug.pocoo.org/docs/datastructures/

के साथ कई चाबियाँ शामिल कर सकते हैं का उपयोग करता है के लिए मैं मिलती है: ImmutableMultiDict([('tag', u'1'), ('tag', u'2'), ('tag', u'3')])

और कुप्पी/WERKZEUG के एक पुराने संस्करण के कारण request.form.getlist('tag')

यह हो सकता है के साथ मूल्यों को प्राप्त कर सकते हैं?

+0

मैं फ्लास्क '0.9' और वेर्केज़ग' 0.8.3' का उपयोग कर रहा हूं। आप किस संस्करण पर चल रहे हैं? – lovesh