2012-02-20 5 views
0

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

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

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, заключается в том, что я хочу, чтобы пользователи сначала не вводили одну и ту же форму дважды (до этапа редактирования, в исходном представлении ввода).

Любые идеи?

EDIT: обратите внимание, что «a» относится к сеансу, который включает раскрывающееся поле всех доступных экземпляров. Этот перенос будет указывать, какой экземпляр пользователь хочет изменить. `

+1

В предыдущей точке зрения, у вас сохранен «а» в базу данных, прежде чем добавить его к сессии? Что произойдет, если вы напечатаете a.id (я подозреваю, что это может быть «Нет») – Alasdair

+0

да, они сохранены в базе данных .. и когда я печатаю, на самом деле дает мне идентификатор .. не только это, но и успешно предварительно заполняя форму всеми полями a, поэтому она определенно переносит ее. – JohnnyCash

+0

«a» ссылается на раскрывающийся список в другом представлении, которое пользователь выберет, который укажет экземпляр WHICH, который они хотят отредактировать. – JohnnyCash

ответ

1

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

1

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

def edit(request, pk): 

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

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

Вы можете добавить поле «состояние» на модели для управления технологическими процессами (проекта, действует)

+0

модель IS сохранена в базе данных .. «a» относится к выпадающему меню в другом представлении, которое пользователь выберет, который укажет экземпляр WHICH, который они хотят редактировать .. – JohnnyCash

+0

Я предлагаю вам изменить метод перевода экземпляра для просмотра , Используйте url вместо сеанса. – danihp

0

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

И вы можете получить значение из сессии в более вещий образом:

try: 
    a = request.session['a'] 
except KeyError: 
    raise Http404('a was not found') 
Смежные вопросы