во-первых, извините за мой плохой английский. Я надеюсь, что вы можете понять меня легко. Я пытаюсь создать блог с помощью 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()
На этот раз он не выдает никакой ошибки, но не обновляет данные. Несмотря на многочасовые поиски, по какой-то причине я не смог найти ощутимого решения. Хотел в крайнем случае обратиться к уважаемым кодерам и надеюсь на вашу помощь.
Проблема в том, что вы создаете новую запись со следующим кодом, а это представление выглядит как обновление:
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)
Похоже, что данные не включаются в POST. Вы можете убедиться, что данные предоставляются, проверив запрос на сетевой панели инструментов разработчика вашего браузера.
И можно ли использовать это представление только для запросов POST
или оно действительно и для запросов GET
?
Я просмотрел инструменты разработчика и вижу, что он реализует метод post, он вернул 302 в качестве кода состояния с новой информацией о данных, которую необходимо обновить. Есть ли у вас какие-либо идеи?
@Tufan Я обновил свой ответ, включив в него исправление для метода сохранения модели.
Пока я разговаривал с вами, я немного подозревал эту ситуацию, но я все еще понятия не имел, как это сделать. Сейчас он обновляет пост. Ты лучший! Спасибо
Если form.is_valid():post = form.save() print(post.post_content) Я попробовал этот код и увидел, что контент поступает на терминал, но он все равно не обновляет данные. Может быть, мне нужно переопределить команду сохранения?