Многомерные массивы в POST и GET

288 views
Skip to first unread message

RusId

unread,
Jul 12, 2012, 9:04:03 AM7/12/12
to flask-...@googlegroups.com
Доброго времени суток товарисчи.
В php можно было в html форме в качестве имени для input указывать такие вещи
<input type="text" name="user[name]" value="<value>"/>
<input type="text" name="user[age]" value="<value>"/> 
и ловить в POST или GET (смотря каким методом постим форму)
многомерный массив вида 
user = Array(
 [name] = <value> 
 [age] = <value> 
)

глубина массива может быть сколько угодно.

у flask есть возможность получать данные с формы аналогичным способом ? или придется писать свой парсер для данных из request.form ?

Владимир Прохода

unread,
Jul 12, 2012, 9:08:44 AM7/12/12
to flask-...@googlegroups.com
Ты можешь просто создать инпуты с одинаковым name, а потом использовать request.form.getlist('name_of_field')

2012/7/12 RusId <Idriso...@yandex.ru>



--
Если есть трудное дело, поручите его лентяю: он найдет более легкое решение.

Владимир Прохода

unread,
Jul 12, 2012, 9:14:19 AM7/12/12
to flask-...@googlegroups.com
А черт, поспешил.

Итак сходу не знаю такого способа.

Посмотри на wtforms и параметр prefix. Ты размещаешь на странице сколько угодно форм с префиксом и работаешь уже с очищенными данными из каждой формы.



2012/7/12 Владимир Прохода <vladimi...@gmail.com>

RusId

unread,
Jul 12, 2012, 9:34:46 AM7/12/12
to flask-...@googlegroups.com
спс за ответ. но такой способ не очень удобен. т.к. я планирую формировать имена динамический при заполнении формы. и после читать о обработчике. 
собственно для наглядного примера
есть список юзеров. надо сделат простую форму в которой можно редактировать их данные.
предпологается что на форме мы будем видеть весть список сразу. обработчик будет тупо обновлять все данные юзеров в бд
в пхп я бы это сделал так

форма:

<form>
foreach ( $user_list as $user ):
<input type="text" name="user[$user['id']][name]" value="$user['name']"/>
<input type="text" name="user[$user['id']][age]" value="$user['age']"/> 
endforeach
 <input type="submit" name="save" value="save"/>  

</form>

В обработчике

foreach ($_POST['user'] as $id=>$user){
 $usr_obj.id = $id;
 $usr_obj.name = $user['name']; 
 $usr_obj.age = $user['age'];
 $usr_obj.save() 


код в примере привел кратко. главное что бы была понятна суть того что я хочу сделать но в pythone


четверг, 12 июля 2012 г., 17:08:44 UTC+4 пользователь Владимир Прохода написал:

Oleg Lebedev

unread,
Jul 12, 2012, 9:41:56 AM7/12/12
to flask-...@googlegroups.com
А что дало изучение объекта request? с помошью хоть даже dir(request)

12 июля 2012 г., 19:34 пользователь RusId <Idriso...@yandex.ru> написал:



--
Best regards,

Oleg Lebedev

RusId

unread,
Jul 12, 2012, 9:56:15 AM7/12/12
to flask-...@googlegroups.com
собсвенно вот
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_file_stream', '_is_old_module', '_load_form_data', '_parse_content_type', '_parsed_content_type', 'accept_charsets', 'accept_encodings', 'accept_languages', 'accept_mimetypes', 'access_route', 'application', 'args', 'authorization', 'base_url', 'blueprint', 'cache_control', 'charset', 'content_length', 'content_type', 'cookies', 'data', 'date', 'dict_storage_class', 'encoding_errors', 'endpoint', 'environ', 'files', 'form', 'form_data_parser_class', 'from_values', 'headers', 'host', 'host_url', 'if_match', 'if_modified_since', 'if_none_match', 'if_range', 'if_unmodified_since', 'input_stream', 'is_multiprocess', 'is_multithread', 'is_run_once', 'is_secure', 'is_xhr', 'json', 'list_storage_class', 'make_form_data_parser', 'max_content_length', 'max_form_memory_size', 'max_forwards', 'method', 'mimetype', 'mimetype_params', 'module', 'on_json_loading_failed', 'parameter_storage_class', 'path', 'pragma', 'query_string', 'range', 'referrer', 'remote_addr', 'remote_user', 'routing_exception', 'scheme', 'script_root', 'shallow', 'stream', 'url', 'url_charset', 'url_root', 'url_rule', 'user_agent', 'values', 'view_args', 'want_form_data_parsed']

интуитивно ни чего подходящего не вижу. да и с инглш у меня не очень (

четверг, 12 июля 2012 г., 17:41:56 UTC+4 пользователь olevedev написал:

Владимир Прохода

unread,
Jul 12, 2012, 10:04:47 AM7/12/12
to flask-...@googlegroups.com
В чем проблема делать список форм с префиксом зависящим от пользователя? Формы можно будет использовать как одиночно, так и списком, можно прописать правила валидности прямо в форме.

Такой примерный код выглядит логичнее, чем любой с использованием словаря в POST:

class UserForm(Form):
    username = TextField()
    email = EmailField()

def view(request):
    forms = []
    for user in users:
        form = UserForm(request.form or None, prefix='u' + user.id)
        if form.validate():
            form.populate_obj(user)
            user.save()
        forms.append(form)



2012/7/12 RusId <Idriso...@yandex.ru>

Владимир Прохода

unread,
Jul 12, 2012, 10:05:48 AM7/12/12
to flask-...@googlegroups.com
Ну т.е. вы пытаетесь применить паттерн работы с формами из PHP, который просто не нужен.

2012/7/12 RusId <Idriso...@yandex.ru>

Oleg Lebedev

unread,
Jul 12, 2012, 10:33:02 AM7/12/12
to flask-...@googlegroups.com
Да, все верно. Стоит еще отметить что во Flask нет возможности так делать, и это еще две библиотеки WTForm + Flask-WTF. Тогда счастье у товарисчей наступает моментально. 

12 июля 2012 г., 20:05 пользователь Владимир Прохода <vladimi...@gmail.com> написал:

RusId

unread,
Jul 13, 2012, 2:30:21 AM7/13/12
to flask-...@googlegroups.com
всем спосибо за помощь в решении. в будущем я уже буду знать что надо копать в сторону  WTForm + Flask-WTF. но пока для данной задачи написал собсвенный парсер который возвращает массив аналогично пхпшному. это оказалось на данный момент быстрее. 

четверг, 12 июля 2012 г., 18:33:02 UTC+4 пользователь olevedev написал:
Reply all
Reply to author
Forward
0 new messages