Доступ к полю формы множественного выбора во Flask

У меня есть множественный выбор в html файле, например:

<select multiple id="mymultiselect" name="mymultiselect">         
        <option value="1">this</option>       
        <option value="2">that</option>       
        <option value="3">other thing</option>
</select>

Когда я получаю доступ к полю mymultiselect в flask / python через:

request.form['mymultiselect']

или с помощью функции request.args.get она возвращает только один выбранный элемент. Я узнал, что для получения всех выбранных элементов мне нужно добавить [] к имени поля, например:

<select multiple id="mymultiselect" name="mymultiselect[]">       
        <option value="1">this</option>       
        <option value="2">that</option>       
        <option value="3">other thing</option>
</select>

Я могу видеть, просматривая данные сообщения в firebug, что это работает, но я каждый раз, когда пытаюсь получить доступ к этому полю в flask / python, оно возвращается как null или None.

Как получить доступ к этим полям формы множественного выбора, у которых в конце имени есть «[]»? Я также пробовал добавить «[]» к имени поля в коде Python, но это, похоже, не работает.


person kj4ohh    schedule 19.09.2012    source источник


Ответы (3)


Вы хотите использовать getlist() функцию, чтобы получить список ценности:

multiselect = request.form.getlist('mymultiselect')

Вам не нужно добавлять [] к имени, чтобы это работало; на самом деле [] не поможет, не используйте его вообще.

person Martijn Pieters    schedule 19.09.2012
comment
Мне потребовалось невероятно много времени, чтобы найти это - отладив это, даже не ясно, является ли проблема Flask, и только когда я нашел [] PHP, я подумал, что специально искать Python / Flask. Есть идеи, почему get не возвращает список? Я вообще не вижу желательности в таком поведении ... Это особенно странно, поскольку get возвращает первый элемент. Ага. - person OJFord; 07.04.2016
comment
Так что, если есть только один элемент? Когда get должен возвращать список, а когда - одно значение? API здесь явный; get всегда возвращает одно значение. getlist всегда возвращает список. - person Martijn Pieters; 07.04.2016
comment
Это здорово, я изо всех сил пытался вернуть все элементы списка и не получал ни одного. - person nishantvas; 04.10.2017

введите здесь описание изображения> Иногда, если вы используете метод Ajax POST, проверьте имя параметра на вкладке сети. Проверьте прикрепленное изображение, в котором описано, как проверить имена параметров.

В представлении Flask:

вы можете получить доступ к списку ответов на основе имени параметра.

request.form.getlist('mymultiselect[]')

or

request.form.getlist('mymultiselect')
person Ramesh Ponnusamy    schedule 16.04.2020
comment
@MartijnPieters уже дал четкий совет не использовать [] в имени. - person CodeMantle; 15.05.2020
comment
Это опечатка. Я хочу сказать, что вы должны убедиться, что имя параметра передано так, как вы заявили. Иногда само имя параметра имеет символ «[]». - person Ramesh Ponnusamy; 15.05.2020

Вы можете создать функцию для получения значений в виде словаря

def __get_form_data(self, method='POST', compare_with=dict()):
    # Get form MiniFieldStorage items
    form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ={ 'REQUEST_METHOD' : method })
    # Convert to dictionary
    return { key.rstrip('[]'):form.getlist(key) if key.endswith('[]') else form.getvalue(key) for key in form.keys() if compare_with.get(key)!=form.getvalue(key) }
person Pablo Luaces    schedule 10.02.2020