Как обновить данные в Django при получении уникальной ошибки поля

во-первых, извините за мой плохой английский. Я надеюсь, что вы можете понять меня легко. Я пытаюсь создать блог с помощью django, но есть место, которое я не могу решить. Я использовал уникальное поле slug вместо id для URL-адреса, всякий раз, когда я хочу обновить данные, я получаю ошибку ограничения UNIQUE: ошибка post_post.url_text (url_text - это имя переменной slugfield). Вот моя модель,

и форма выглядит так,

Сначала я пошел по пути обновления данных здесь:

@login_required(login_url='login')
def post_update(request, url_text=None):
post = get_object_or_404(Post, url_text=url_text)
form = PostWrite(request.POST or None, instance=post)

if form.is_valid():
    post_author = request.user
    post_title = form.cleaned_data.get('post_title')
    post_content = form.cleaned_data.get('post_content')
    post_tags = form.cleaned_data.get('tags')
    post = Post(post_author=post_author, post_title=post_title, post_content=post_content, tags=post_tags)
    post.save()
    

context = {
    'post': post,
    'form': form,
}

return render(request, 'post/re_write.html', context)

и я получил ошибку, которую я упоминал в начале поста. Затем я нашел подобное решение на форумах,

if form.is_valid():
    form.save()

На этот раз он не выдает никакой ошибки, но не обновляет данные. Несмотря на многочасовые поиски, по какой-то причине я не смог найти ощутимого решения. Хотел в крайнем случае обратиться к уважаемым кодерам и надеюсь на вашу помощь.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
662
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы создаете новую запись со следующим кодом, а это представление выглядит как обновление:

post = Post(post_author=post_author, post_title=post_title, post_content=post_content, tags=post_tags)
post.save()

Вместо этого вы должны использовать форму модели, которую вы уже используете, чтобы сохранить изменения в экземпляре:

if form.is_valid():
    post = form.save()

Я предполагаю, что, возможно, из-за того, что вы не записывали сообщение из form.save(), отображаемый шаблон не обновлял данные, потому что экземпляр, переданный в шаблон, был до внесения изменений.

Другая проблема:

Вы переопределяете метод сохранения, но не всегда вызываете super().save. Это означает, что вы сохраняете пост только тогда, когда свойство url_text не установлено. Вместо этого всегда звоните super().save

def save(self, *args, **kwargs):
    if ...
       # other stuff
    super().save(*args, **kwargs)

Если form.is_valid():post = form.save() print(post.post_content) Я попробовал этот код и увидел, что контент поступает на терминал, но он все равно не обновляет данные. Может быть, мне нужно переопределить команду сохранения?

Tufan 22.12.2020 17:49

Похоже, что данные не включаются в POST. Вы можете убедиться, что данные предоставляются, проверив запрос на сетевой панели инструментов разработчика вашего браузера.

schillingt 22.12.2020 17:50

И можно ли использовать это представление только для запросов POST или оно действительно и для запросов GET?

schillingt 22.12.2020 17:51

Я просмотрел инструменты разработчика и вижу, что он реализует метод post, он вернул 302 в качестве кода состояния с новой информацией о данных, которую необходимо обновить. Есть ли у вас какие-либо идеи?

Tufan 22.12.2020 18:03

@Tufan Я обновил свой ответ, включив в него исправление для метода сохранения модели.

schillingt 22.12.2020 18:11

Пока я разговаривал с вами, я немного подозревал эту ситуацию, но я все еще понятия не имел, как это сделать. Сейчас он обновляет пост. Ты лучший! Спасибо

Tufan 22.12.2020 18:22

Другие вопросы по теме