Найти - Пользователи
Полная версия: Как обновить существующий экземпляр модели с уникальным полем через form.save()?
Начало » Django » Как обновить существующий экземпляр модели с уникальным полем через form.save()?
1
buddha
Здравствуйте.
Есть моделька с уникальным полем 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() не умеет обновлять уникальные поля?
Ariesua
Используй метод формы clean.
inoks
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))
buddha
Извините ребята. Написанный мной код работает правильно, проблема была в другом…
А метод clean и добавление экземпляра модели в BookMarkForm(instance=bookmark_obj) это вы конечно вообще мимо…
inoks
Напишите в чем была проблема.
buddha
Всё оказалось просто:
-В функции представления рендерил(render() ) не тот шаблон.
-В самом шаблоне ставил не тот URL в аргумент формы action.
Из-за этого и вопрос вам задал некорректный, простите)

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

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

При указании instance данные в initial сформируются автоматически
buddha
Спасибо, переписал…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB