Метод модели Django не вносит изменения в объект
У меня есть метод в моей модели для изменения объекта из опубликованного в неопубликованный. Перенаправление работает нормально, но в моей базе данных ничего не происходит. Если объект опубликован, то он остается таким без изменений, когда нажимается кнопка для неопубликования объекта (статья в блоге)
Это модель и метод
class Post(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
published = models.BooleanField(default=False, null=True, blank=True)
def unpublish(self):
self.published == False
self.save()
Мое мнение
def unpublish_post(request, slug):
post = get_object_or_404(Post, slug=slug)
post.unpublish
return redirect('dashboard')
Мой urls.py
path('unpublish-post/<slug>/', unpublish_post, name='unpublish-post'),
Есть три незначительные ошибки:
- you set a variable with a single equal sign (
=
), not a double equal sign (==
); - you should call the
.unpublish()
method; and - you should only allow to access this view in a POST or DELETE request.
В вашей модели, таким образом, мы переписываем логику так:
class Post(models.Model):
# …
def unpublish(self):
self.published = False
self.save()
а в представлении мы вызываем метод и ограничиваем доступ для POST и/или DELETE запроса:
from django.views.decorators.http import require_http_methods
@require_http_methods(['POST', 'DELETE'])
def unpublish_post(request, slug):
post = get_object_or_404(Post, slug=slug)
post.unpublish()
return redirect('dashboard')
Таким образом, клиенту необходимо сделать запрос POST/DELETE, а не GET. Таким образом, шаблон должен выглядеть следующим образом:
<form method="POST" action="{% 'unpublish-post' post.slug %}">
<input type="submit" value="unpublish">
</form>