Django и массивы HTML

У меня есть форма с этими входами:

<input name="person[name]" value="">
<input name="person[surname]" value="">
<input name="person[age]" value="">

когда я отправляю, как я могу назначить этот html-массив переменной, потому что request.POST.getlist('person') не работает, я проверял другой пост, но единственный, который я нашел, не имеет ничего полезного

THEAD

Я надеюсь, что кто-то может помочь мне понять это, заставить прочитать документ и вполне понять, как это сделать...


дело в том, что у меня есть таблица в моей БД со скидками... где каждая скидка имеет значение по умолчанию... так что я сделал это

discounts = Discount.objects.all( )

{% for i in discounts %} 
<input name="discount[{{ i.id }}]" value="{{ i.default_value }}"> 
{% endfor %}

а на моем у меня нет никакого способа поймать этот html-массив, который я отправляю ... какие-либо предложения?


person Ignus    schedule 26.10.2009    source источник
comment
Исходя из PHP, это довольно интуитивный способ работы с формами и массивами. На самом деле не вижу недостатка в таком автоматическом разборе. Можно легко увидеть, что django разрешает request.POST.get('person',{}).get('surname', '')   -  person Mikhail    schedule 08.05.2013
comment
Для нескольких входов с одинаковым именем вы можете использовать request.POST.getlist(...)   -  person Mikhail    schedule 09.05.2013


Ответы (3)


Извините, что отвечаю на такой старый вопрос, но я застрял с той же проблемой и не нашел для нее приемлемых ответов. Итак, вот мое решение:

def get_post_dict(post, key):
    result = {}
    if post:
        import re
        patt = re.compile('^([a-zA-Z_]\w+)\[([a-zA-Z_\-][\w\-]*)\]$')
        for post_name, value in post.items():
            value = post[post_name]
            match = patt.match(post_name)
            if not match or not value:
                continue
            name = match.group(1)
            if name == key:
                k = match.group(2)
                result.update({k:value})
    return result

Теперь вы можете использовать его так:

persons = get_post_dict(request.POST, 'person')
...

or

django.http.QueryDict.getdict = get_post_dict
persons = request.POST.getdict('person')
person Sergey    schedule 24.09.2010
comment
Вы уверены, что в Django не реализована такая полезная вещь? - person Mahdi; 20.09.2013


Если вы определяете свои формы таким образом в шаблонах, вы не можете напрямую сопоставить их со словарем.

Вы должны получить только отдельные значения

request.POST['person[name]']

Однако это не способ использовать формы в django. Вам лучше определить эти поля в соответствии с декларативным синтаксисом формы django (docs) , и пусть django обрабатывает рендеринг в шаблонах, используя тег вроде:

{{form.as_p}}
{{form.as_table}}

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

person lprsd    schedule 26.10.2009
comment
дело в том, что у меня в БД есть таблица со скидками... где каждая скидка имеет значение по умолчанию... поэтому я сделал это {% для i в скидках %} ‹input name=discount[{{ i.id } }] value={{ i.default_value }}› и, на мой взгляд, у меня нет никакого способа поймать этот html-массив, который я отправляю... какие-либо предложения? - person Ignus; 26.10.2009
comment
Вы должны создать форму модели или форму и передать ей исходный словарь, если это необходимо. документы, упомянутые выше, могут помочь. Если вам нужна помощь в чем-то конкретном, задайте отдельный вопрос или обновите этот. - person lprsd; 26.10.2009