2012-11-26 8 views
7

के साथ WTForms का उपयोग कर फ्लास्क ऐप मेरे पास एक फ्लास्क एप्लिकेशन है जो उपयोगकर्ता इनपुट के लिए WTForms का उपयोग करता है। यह एक फॉर्म में SelectMultipleField का उपयोग करता है। मुझे चयनित होने पर फ़ील्ड में सभी आइटम पोस्ट करने के लिए ऐप नहीं मिल रहा है; यह केवल पहले आइटम को भेजता है चाहे उपयोगकर्ता कितने चुनता है।SelectMultipleField

Flask documentation कहते हैं इस क्षेत्र प्रकार से भेजे गए डेटा के बारे में इस है, लेकिन मैं इस व्यवहार को नहीं देख पा रहे:

SelectMultipleField पर डेटा जिनमें से प्रत्येक है वस्तुओं की एक सूची के रूप में संग्रहीत किया जाता है, फॉर्म इनपुट से चेक और coerced।

यहाँ है कि यह दिखाता है एक पूर्ण, कम से कम बोतल अनुप्रयोग है:

#!/usr/bin/env python 

from flask import Flask, render_template_string, request 
from wtforms import Form, SelectMultipleField 

application = app = Flask('wsgi') 

class LanguageForm(Form): 
    language = SelectMultipleField(u'Programming Language', choices=[('cpp', 'C++'), ('py', 'Python'), ('text', 'Plain Text')]) 

template_form = """ 
{% block content %} 
<h1>Set Language</h1> 

<form method="POST" action="/"> 
    <div>{{ form.language.label }} {{ form.language(rows=3, multiple=True) }}</div> 
    <button type="submit" class="btn">Submit</button>  
</form> 
{% endblock %} 

""" 

completed_template = """ 
{% block content %} 
<h1>Language Selected</h1> 

<div>{{ language }}</div> 

{% endblock %} 

""" 

@app.route('/', methods=['GET', 'POST']) 
def index(): 
    form = LanguageForm(request.form) 

    if request.method == 'POST' and form.validate(): 
     print "POST request and form is valid" 
     language = request.form['language'] 
     print "languages in wsgi.py: %s" % request.form['language'] 
     return render_template_string(completed_template, language=language) 

    else: 

     return render_template_string(template_form, form=form) 

if __name__ == '__main__': 
    app.run(debug=True) 

उत्तर

9

बोतल एक WERKZEUG MultiDict वस्तु के रूप में देता है Request.Form। यह एक शब्दकोश की तरह है, केवल अवांछित के लिए जाल के साथ।

http://flask.pocoo.org/docs/api/#flask.request http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.MultiDict

MultiDict सभी मानक तरीकों शब्दकोश लागू करता है। आंतरिक रूप से, यह एक सूची के रूप में एक कुंजी के लिए सभी मानों को बचाता है, लेकिन मानक dict Access विधियों को केवल कुंजी के लिए पहला मान वापस कर देगा। यदि आप अन्य मूल्यों तक पहुंच प्राप्त करना चाहते हैं, तो भी आपको सूची विधियों का उपयोग करना होगा।

हालांकि, मुझे लगता है कि एक आसान तरीका है। आप मुझ पर एक एहसान करते हैं और जगह की कोशिश कर सकते हैं:

language = request.form['language'] 

साथ

language = form.language.data 

और देखते हैं कि यदि कोई अलग है? डब्ल्यूटीएफओम्स को मल्टीडिक्ट ऑब्जेक्ट को संभालना चाहिए और केवल आपके लिए एक सूची वापस करनी चाहिए क्योंकि आपने फॉर्म डेटा को बाध्य कर दिया है।

+0

वह था! बहुत धन्यवाद! – Raj