#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 Я обновил свой ответ, чтобы также включить исправление для метода сохранения модели.