Django Перезаписать данные формы сохранены - PullRequest
0 голосов
/ 21 февраля 2012

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

У меня есть форма, которая принимает введенные данные пользователем. На другой странице я создаю идентичную форму, которую заполнил пользователь (предварительно заполненный этой информацией) для целей редактирования. Пользователи перейдут на эту страницу, чтобы отредактировать информацию, которую они уже ввели. Моя проблема в том, что она не перезаписывает экземпляр.

def edit(request):

   a = request.session.get('a',  None)

   if a is None:
       raise Http404('a was not found')

   if request.method == 'POST':
       form = Name_Form(request.POST, instance=a)
       if form.is_valid():
           j = form.save( commit=False )
           j.save()
   else:
       form = Name_Form( instance = a )

Для этой формы я использую «unique_together» для некоторых значений. Я также вызываю `{{form.non_field_errors}} в шаблоне.

Что происходит, когда я делаю изменения в представлении редактирования, если изменения полей включают в себя те, которые определены в "unique_together", то возвращается ошибка, сообщающая, что экземпляр уже существует. В противном случае это сохраняет новый экземпляр. Это не ПЕРЕЗАПИСЬ.

Обратите внимание, что причина, по которой я использую unique_together, заключается в том, что я хочу запретить пользователям вводить одну и ту же форму дважды (до этапа редактирования, в начальном представлении ввода).

Есть идеи?

РЕДАКТИРОВАТЬ: обратите внимание, что «а» относится к сеансу, который включает в себя раскрывающийся список всех доступных экземпляров. Это перенесено будет указывать, какой экземпляр пользователь хочет редактировать. `

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Почему бы не выполнить поиск в базе данных модели, которую вы пытаетесь сохранить, и вытянуть поля из формы в модель, а затем сохранить модель?

1 голос
/ 21 февраля 2012

Вместо того, чтобы хранить модель a в сеансе, вы должны сохранить ее в базе данных. Затем отредактируйте его:

def edit(request, pk):

   a = A.objects.get( pk = pk)
   ...

pk это идентификатор a, вы можете отправить его для просмотра через urls.py. Я рекомендую вам использовать POST / Redirect / GET pattern.

Вы можете добавить поле 'state' в вашей модели для управления рабочим процессом ( черновик , действительный )

0 голосов
/ 21 февраля 2012

Вы не должны сохранять объекты в сеансе.Если вам действительно нужно использовать сеанс - сохраните там PK и получите объект прямо перед передачей его в Form.Но лучшее решение - отправить его в параметрах GET или POST или включить в URL.Сеансы ненадежны, данные внутри них могут быть уничтожены между запросами пользователя.

И вы можете извлечь значение из сеанса более питоническим способом:

try:
    a = request.session['a']
except KeyError:
    raise Http404('a was not found')
...