Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как обновить существующий экземпляр модели с уникальным полем через form.save()? [RSS Feed]

#1 Дек. 15, 2012 21:24:56

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Здравствуйте.
Есть моделька с уникальным полем link:

class BookMark(models.Model):
    category = models.ForeignKey(BookMarkCategory, verbose_name=('Category'))
    description = models.TextField(_('Description'), blank=True)
    link = models.CharField(_('Link'), unique=True, max_length=150) # вот это поле
    priority = models.IntegerField(_('Priority'))
    looked_through = models.BooleanField(_('Looked trough'))
    publick = models.BooleanField(_('Public'))

При редактировании этой модели на страничке не получается её обновить(сохранить). Валидация формы выдает ошибку, что такое поле уже существует “Book mark with this Link already exists”.
В функции представление сделал по документации:
def edit_bookmark(request, id):
    bookmark_obj = BookMark.objects.get(pk=id)
    if request.POST:
        form = BookMarkForm(request.POST, instance=bookmark_obj) # вот вставил экземпляр
        if form.is_valid():                                       # а обновлять не желает
            form.save()
            return redirect('show_bookmarks_list')
    else:
        form = BookMarkForm()
        form.initial = bookmark_obj.get_fields_dict()
    return render(request, 'mybookmark/create_bookmark.html', dict(form=form))

Неужели метод form.save() не умеет обновлять уникальные поля?

Отредактировано buddha (Дек. 15, 2012 21:25:43)

Офлайн

#2 Дек. 18, 2012 13:54:54

Ariesua
От:
Зарегистрирован: 2011-06-30
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Используй метод формы clean.



Офлайн

#3 Дек. 19, 2012 12:51:11

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

def edit_bookmark(request, id):
    bookmark_obj = BookMark.objects.get(pk=id)
    if request.POST:
        form = BookMarkForm(request.POST, instance=bookmark_obj) # вот вставил экземпляр
        if form.is_valid():                                       # а обновлять не желает
            form.save()
            return redirect('show_bookmarks_list')
    else:
        form = BookMarkForm(instance=bookmark_obj)
    return render(request, 'mybookmark/create_bookmark.html', dict(form=form))

Офлайн

#4 Дек. 19, 2012 20:48:47

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Извините ребята. Написанный мной код работает правильно, проблема была в другом…
А метод clean и добавление экземпляра модели в BookMarkForm(instance=bookmark_obj) это вы конечно вообще мимо…

Офлайн

#5 Дек. 20, 2012 09:20:39

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Напишите в чем была проблема.

Офлайн

#6 Дек. 20, 2012 09:51:14

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Всё оказалось просто:
-В функции представления рендерил(render() ) не тот шаблон.
-В самом шаблоне ставил не тот URL в аргумент формы action.
Из-за этого и вопрос вам задал некорректный, простите)

Когда поправил, всё заработало как нужно.

Отредактировано buddha (Дек. 20, 2012 10:03:18)

Офлайн

#7 Дек. 20, 2012 10:21:05

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

ок, еще вопрос - почему используешь

form = BookMarkForm()
form.initial = bookmark_obj.get_fields_dict()
а не
form = BookMarkForm(instance=bookmark_obj)

Офлайн

#8 Дек. 20, 2012 12:12:32

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Так это ж разные вещи.
Атрибут instance служит для обновления модели после вызова form.save().
Атрибут initial для заполнения предварительных данных именно для отображения на страничке. Т.е. я этим показываю , какие значения уже имеются(чисто для справки).

Офлайн

#9 Дек. 20, 2012 13:49:30

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

buddha
Так это ж разные вещи.Атрибут instance служит для обновления модели после вызова form.save().Атрибут initial для заполнения предварительных данных именно для отображения на страничке. Т.е. я этим показываю , какие значения уже имеются(чисто для справки).

При указании instance данные в initial сформируются автоматически



Офлайн

#10 Дек. 20, 2012 14:11:07

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как обновить существующий экземпляр модели с уникальным полем через form.save()?

Спасибо, переписал…

Офлайн

  • Начало
  • » Django
  • » Как обновить существующий экземпляр модели с уникальным полем через form.save()?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version