Чтение многомерных массивов из запроса POST в Django - PullRequest
11 голосов
/ 02 марта 2011

У меня есть клиент jquery, который отправляет запрос POST с многомерным массивом, что-то вроде этого:

friends[0][id]    12345678 
friends[0][name]  Mr A
friends[1][id]    78901234
friends[1][name]  Mr B

То есть массив из двух элементов, имени и идентификатора,

Существует ли автоматический способ получения этого ввода в виде списка или словаря?Я не могу заставить работать .getlist

Ответы [ 3 ]

7 голосов
/ 31 марта 2011

Ссылка DrMeers больше не действительна, поэтому я опубликую другой способ достижения того же самого. Это также не идеально, и было бы намного лучше, если бы у Django была такая встроенная функция. Но, поскольку это не так:

Преобразование многомерных массивов форм в Django

Отказ от ответственности: я написал этот пост. Суть этого в этой функции, которая может быть более устойчивой, но она работает для массивов одноуровневых объектов:

def getDictArray(post, name):
    dic = {}
    for k in post.keys():
        if k.startswith(name):
            rest = k[len(name):]

            # split the string into different components
            parts = [p[:-1] for p in rest.split('[')][1:]
            print parts
            id = int(parts[0])

            # add a new dictionary if it doesn't exist yet
            if id not in dic:
                dic[id] = {}

            # add the information to the dictionary
            dic[id][parts[1]] = post.get(k)
    return dic
5 голосов
/ 13 мая 2011

Это связано с этим вопросом .Как уже говорилось, я создал специальную библиотеку для Django / Python для обработки многомерных массивов, отправляемых через запросы.Вы можете найти его на GitHub здесь .

4 голосов
/ 03 марта 2011

Это помогает?http://dfcode.com/blog/2011/1/multi-dimensional-form-arrays-and-django/

Если вам нужны данные POST, единственный способ получить их - указать точное имя, которое вы ищете:

    person[1].name = request.POST['person[1][name]']
    person[1].age = request.POST['person[1][age]']
    person[2].name = request.POST['person[2][name]']
    person[2].age = request.POST['person[2][age]']

Вот быстрыйобходной путь на лету в Python, когда вам нужно извлечь значения формы без явного ввода полного имени в виде строки:

    person_get = lambda *keys: request.POST[
        'person' + ''.join(['[%s]' % key for key in keys])]

Теперь, когда вам нужна информация, добавьте одну из этих присосокбудет иметь гораздо более широкую гибкость.Быстрый пример:

    person[1].name = person_get('1', 'name')
    person[1].age = person_get('1', 'age')
    person[2].name = person_get('2', 'name')
    person[2].age = person_get('2', 'age')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...