Нажатие на кнопку в 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'])
    ...
Вернуться на верх