инициализация формы с данными с помощью django в Google Appengine - PullRequest
2 голосов
/ 05 мая 2011

У меня есть обработчик сообщений, который использует 'from google.appengine.ext.db.djangoforms.ModelForm'. Он извлекает существующий экземпляр из базы данных, затем инициализирует форму следующим образом:

  myForm = TestForm(instance=self_instance, data=post_data)

Я помещаю только одно из трех свойств в post_data, которое корректно копируется в форму, но два других свойства, которые уже имеют значения в self_instance, устанавливаются в None. Можно ли этого избежать?

Спасибо, Ричард

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Это дает мне поведение, за которым я следую:

if self_instance:
  logging.info('creating form with instance so updating the post data, we need this to bind the form so we can validate it')
  if post_data:
    #update the post data with existing values
    for prop in self_instance._properties:
      if prop not in post_data:
        cur_prop_val = getattr(self_instance, prop)
        if isinstance(cur_prop_val,db.Model):
          str(cur_prop_val.key())
        else:
          post_data[prop] = cur_prop_val
  else:
    logging.info('no post data so not adding it to form')
  form_data = form_class(data=post_data,instance=self_instance)
else:
  logging.info('creating form without instance')
  form_data = form_class(data=post_data)  
1 голос
/ 05 мая 2011
  1. Если вы предоставляете instance arg, форма считается несвязанной
  2. Если вы предоставляете data arg, форма считается связанной

Если вы предоставляетеоба, data будут переопределять instance (=> так же, как в случае 2, привязка к форме).

Так что в вашем случае лучше загрузить self_instance, затем обновить его с помощью data и затем использоватьнесвязанная форма:

myForm = TestForm(instance=self_instance)
1 голос
/ 05 мая 2011

Вы не показываете свое определение формы. Но, как правило, если вы не хотите включать поля в форму, вы должны указать их в кортеже Meta exclude - тогда они не будут перезаписаны несуществующими данными POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...