Django Form Preview – Как работать с 'cleaned_data'

Благодаря Insin для ответа на предыдущий вопрос, связанный с этим.

Его ответ сработал и работает хорошо, однако я озадачен предоставлением «cleaned_data» или, точнее, как его использовать?

  • Как отобразить время типа «x дней назад», используя Humanize в шаблоне Django?
  • Автозаполнение Vim, Python и Django (pysmell?)
  • Django-tastypie: Любой пример загрузки файла в POST?
  • Как испустить событие SocketIO на сервере
  • Редактирование связанных объектов в ModelFormSet
  • Как выполнить GROUP BY ... COUNT или SUM в Django ORM?
  • class RegistrationFormPreview(FormPreview): preview_template = 'workshops/workshop_register_preview.html' form_template = 'workshops/workshop_register_form.html' def done(self, request, cleaned_data): # Do something with the cleaned_data, then redirect # to a "success" page. registration = Registration(cleaned_data) registration.user = request.user registration.save() # an attempt to work with cleaned_data throws the error: TypeError # int() argument must be a string or a number, not 'dict' # obviously the fk are python objects(?) and not fk_id # but how to proceed here in an easy way? # the following works fine, however, it seems to be double handling the POST data # which had already been processed in the django.formtools.preview.post_post # method, and passed through to this 'done' method, which is designed to # be overidden. ''' form = self.form(request.POST) # instansiate the form with POST data registration = form.save(commit=False) # save before adding the user registration.user = request.user # add the user registration.save() # and save. ''' return HttpResponseRedirect('/register/success') 

    Для краткой справки, вот содержание метода post_post:

     def post_post(self, request): "Validates the POST data. If valid, calls done(). Else, redisplays form." f = self.form(request.POST, auto_id=AUTO_ID) if f.is_valid(): if self.security_hash(request, f) != request.POST.get(self.unused_name('hash')): return self.failed_hash(request) # Security hash failed. return self.done(request, f.cleaned_data) else: return render_to_response(self.form_template, {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state}, context_instance=RequestContext(request)) 

  • Общий объект между запросами в Django
  • Как добавить столбец в таблицу ManyToMany (Django)
  • django 1.4 - не может сравнивать даты смещения и наименьшего времени
  • Длительный опрос в Django
  • Не удается открыть файл 'django-admin.py': Нет такого файла или каталога
  • xhtml2pdf не вставляет Helvetica
  • One Solution collect form web for “Django Form Preview – Как работать с 'cleaned_data'”

    Я никогда не пробовал, что вы делаете здесь с ModelForm раньше, но вы могли бы использовать оператор ** для расширения вашего словаря cleaned_data в аргументы ключевых слов, ожидаемые для вашего конструктора регистрации:

      registration = Registration (**cleaned_data) 

    Конструктор к вашим классам модели принимает аргументы ключевых слов, которые мета-класс модели Django преобразуется в атрибуты уровня экземпляра на результирующем объекте. Оператор ** – это соглашение о вызове, которое сообщает Python о расширении вашего словаря в этих аргументах ключевого слова.

    Другими словами…

    То, что вы делаете в настоящее время, равнозначно этому:

     registration = Registration ({'key':'value', ...}) 

    Это не то, что вы хотите, потому что конструктор ожидает аргументы ключевых слов, а не словарь, содержащий ваши аргументы ключевого слова.

    То, что вы хотите делать, это

     registration = Registration (key='value', ...) 

    Что аналогично этому:

     registration = Registration (**{'key':'value', ...}) 

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

    Похоже, что вы теряете часть функциональности, присущей ModelForms, просматривая утилиту предварительного просмотра формы. Возможно, вы должны использовать свой вариант использования в списке рассылки Django и посмотреть, есть ли потенциальное расширение этого API, которое могло бы улучшить его работу с ModelForms.

    редактировать

    В дополнение к тому, что я описал выше, вы всегда можете просто извлекать поля из своего словаря cleaned_data «вручную» и передавать их в свой конструктор регистрации, но с предостережением, которое вы должны помнить, чтобы обновить этот код при добавлении нового полей вашей модели.

     registration = Registration ( x=cleaned_data['x'], y=cleaned_data['y'], z=cleaned_data['z'], ... ) 
    Python - лучший язык программирования в мире.