मैं कुप्पी के 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
के लिए कोई मूल्य नहीं मिल रहा है।
क्या गलत है?
मेरी अज्ञानता को क्षमा करें, लेकिन मैंने पहले WTForms का उपयोग नहीं किया है। क्या एक [फील्डलिस्ट] (http://wtforms.simplecodes.com/docs/0.6/fields.html#wtforms.fields.FieldList) 'ListField' से अलग है? –
@AlexL सं। वे समान हैं। [यहां] देखें (https://flask-mongoengine.readthedocs.org/en/latest/)। 'समर्थित फ़ील्ड' अनुभाग में – lovesh