django Piston Post Request Изменить строки в списки - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть простой обработчик Django-Piston, который создает новый экземпляр модели и сохраняет его.

На клиенте я публикую сообщения с использованием объектов Javascript и JQuery.post.

После проверки данных с помощью Firebug строка сообщения выглядит следующим образом:

classification=&organization=&title=Formatting+Test+7&description=test&created_by=created_on=&last_modified=&csrfmiddlewaretoken=a8352bb51f88c271119a81228a5c291f

Как видите, установлены только заголовок, описание и csrfmiddlewaretoken.

Внутри обработчика поршня наВ верхней части метода create перед запуском любого другого кода я распечатываю запрос.POST:

print 'POST:', request.POST

, который выводит следующее в выводе Django Dev Server:

POST: <QueryDict: {u'description': [u'test'], u'classification': [u''], u'title': [u'Formatting Test 7'], u'created_by': [u''], u'created_on': [u''], u'last_modified': [u''], u'organization': [u''], u'csrfmiddlewaretoken': [u'a8352bb51f88c271119a81228a5c291f']}>

Как видите, все данные в списках сейчас.Когда я сохраняю данные с помощью формы Django, он преобразует список в строку, а когда данные отображаются на клиенте, вместо «Форматирование теста 7», он отображает «[Тест форматирования 7 ']».

Похоже, что Google не возвращает никому с такой же проблемой, и я использую Piston уже более 6 месяцев, и я никогда не видел подобной ошибки раньше.

РЕДАКТИРОВАТЬ: Как сказал JPIC, ошибка, которую, как мне показалось, я испытывал, была не ошибкой, а намеренно.Моя проблема заключалась в расширении данных в QuerySet до того, как я использовал их с формой Django.

Неправильный путь:

some_initial_data = {
    'created_by': creator.pk, 
    'organization': org.pk,
    'classification': 7
} 
post = dict(request.POST)
post.update(some_initial_data)
form = MyModelForm(post)

Правильный путь:

Как описано в методе обновления для QueryDict: https://docs.djangoproject.com/en/1.3/ref/request-response/#querydict-objects

some_initial_data = {
    'created_by': creator.pk,
    'organization': org.pk,
    'classification': 7
}
post = request.POST.copy()
post.update(initial_data)
form = MyModelForm(post)

1 Ответ

2 голосов
/ 01 февраля 2012

Это не ошибка, ваши данные всегда были в таком списке, это проектное решение от Django. Независимо от того, какой код обращается к экземпляру QueryDict и получает значения в списке иначе, чем с помощью метода getlist(), QueryDict неправильно использует.

QueryDict допускает несколько значений ключа, т. Е.: foo=bar&foo=test ваш QueryDict будет выглядеть как {u'foo': [u'bar', u'test']}.

Пример с ?foo=bar&foo=test&x=y:

ipdb> request.GET
<QueryDict: {u'x': [u'y'], u'foo': [u'bar', u'test']}>
ipdb> request.GET['x']
u'y'
ipdb> request.GET.getlist('x')
[u'y']
ipdb> request.GET['foo']
u'test'
ipdb> request.GET.getlist('foo')
[u'bar', u'test']

Как видите, QueryDict - это диктат списков, который по умолчанию не будет прибегать к фактическим спискам: он будет действовать как обычный диктант. Поэтому, если какой-то код получает список, он использует QueryDict неправильно.

Стоит отметить, что если вы хотите использовать $.post(url, {'foo':['bar', 'test']}), вам нужно будет позвонить $. AjaxSettings.traditional = true !

Это полезно, например, с флажками или множественным выбором. Поправьте меня, если я ошибаюсь, но это стандартно, и способ PHP foo [] = bar & foo [] = test не является стандартным.

...