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

#django #django-models #django-views #django-forms

#django #django-модели #django-просмотры #django-forms

Вопрос:

прежде всего, я прошу прощения за мой плохой английский. Я надеюсь, что вы сможете легко меня понять. Я пытаюсь создать блог с помощью django, но есть место, которое я не могу решить. Я использовал уникальное поле slug вместо id для url, всякий раз, когда я хочу обновить данные, я получаю сбой УНИКАЛЬНОГО ограничения: ошибка 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()
 

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

Ответ №1:

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

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

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

 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)
 

Комментарии:

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

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

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

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

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