Нажатие на кнопку в html-шаблоне не изменяет поле "статус" в модели django
Всем! У меня models.py
class Post(models.Model):
...
status = models.CharField(max_length=16, choices=STATUS_CHOICES, default='Activated')
...
urls.py
app_name = 'posts'
urlpatterns = [
...
path('<int:pk>/update/', views.PostUpdateView.as_view(), name='update_status')]
views.py
class PostUpdateView(UpdateView):
model = Post
template_name = 'post_detail.html'
def change_status(self):
if request.method == "POST":
post = Post.objects.filter(id=self.id)
if post.status == 'Activated':
post.status = 'Deactivated'
post.save()
elif post.status == 'Deactivated':
post.status = 'Activated'
post.save()
return redirect('posts:post_detail')
posts_detail.html
...
<form action="{% url 'posts:update_status' post.id %}" method="post">
{% csrf_token %}
<button type="button">
{% if post.status == 'Activated' %}
Deactivate
{% else %}
Activate
{% endif %}</button>
</form>
...
Я хочу переключить поле на кнопке "Активировать/деактивировать" и перенаправить на ту же страницу. На данный момент есть кнопка и при нажатии на нее ничего не меняется. Ну или может редирект работает, но статус не переключается. Предполагаю, что неправильно настроен views.py, но не могу понять где.
Я пробовал так
@require_http_methods(['POST'])
def update_status(request, id):
if post.status == 'Activated':
Post.objects.filter(id=id).update(status='Deactivated')
elif post.status == 'Deactivated':
Post.objects.filter(id=id).update(status='Activated')
return redirect('posts:post_detail')
Но это тоже не работает. Я знаю, что это похожие способы, но у меня нет больше идей.
Ну или может быть редирект работает, но статус не переключается.
Правильно ли ваша кнопка отправляет? Возможно, button type='submit' - это то, что вам нужно. Вы можете проверить, правильно ли работает кнопка, следующим образом.
posts_detail.html
...
{{alert}}
<form action="{% url 'posts:update_status' post.id %}" method="post">
{% csrf_token %}
{% if post.status == 'Activated' %}
<button type="submit">Deactivate</button>
{% else %}
<button type="submit">Activate</button>
{% endif %}
</form>
...
views.py
def update_status(request, id):
# For checking submit button works properly
if self.request.method == "POST":
context = {'alert':'POST submitted'}
return render(request, 'templates/posts_detail.html', context)
context = {'alert':'ready for POST'}
return render(request, 'templates/posts_detail.html', context)
...
Если это работает, вы можете рассмотреть возможность добавления дополнительных значений к подобной кнопке для дальнейшего использования.
posts_detail.html
...
<form action="{% url 'posts:update_status' post.id %}" method="post">
{% csrf_token %}
{% if post.status == 'Activated' %}
<button type="submit" name="status" value="Deactivated">Deactivate</button>
{% else %}
<button type="submit" name="status" value="Activated">Activate</button>
{% endif %}
</form>
...
views.py
def update_status(request, id):
if self.request.method == "POST":
Post.objects.filter(id=id).update(status=request.POST['status'])
...