Django HTML-кнопка при нажатии вызывает функцию бэкенда

я пытаюсь добавить в html кнопку, которая появляется только при определенных событиях, это работает для меня, но я хочу добавить скрипт/функцию onclick, которая будет вызывать функцию backend view.py, которая удаляет определенную комнату при нажатии, модель комнаты: owner(fk), name, slug. а модель пользователя: имя пользователя пароль1 пароль2.

Мне просто нужно знать, как вызвать событие onclick, которое вызовет функцию backend в моих представлениях.

rooms.html

{% extends 'core/base.html' %}

{% block title %} Rooms | {% endblock %}

{% block content %}
<div class="main">
    <h1>Rooms</h1>
</div>
<div class="rooms-container">
    {% for room in rooms %}
        <div class="room">
            <div class="room-info">
                <h1 class="room-title">{{ room.name }}</h1>
                <a href="{% url 'room' room.slug %}" class="room-join">Join Room</a>
                {% if request.user == room.owner %}
                    <button class="room-delete" id="roomDelete">Delete Room</button>
                {% endif %} 
            </div>
        </div>
    {% endfor %}
</div>
{% endblock %}

{% block scripts %}
 <!-- todo: add delete room button functionality. -->
{% endblock %} ```

views.py

from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
from django.contrib import messages

from .models import Room, Message

@login_required
def rooms(request):
    if request.method == 'POST':
        room_owner = request.user
        room_name = request.POST['room-name']
        if not Room.objects.filter(slug = room_name).exists():
            if room_name == '' or room_name.isspace() or room_name.startswith(' '):
                messages.info(request, 'Invalid room name, spaces-only or string that starts with spaces is invalid.')
            else:
                new_room = Room(owner = room_owner,name = room_name,slug = room_name)
                new_room.save()
        else:
            messages.info(request, 'That room already exists!, try a different name.')  
    rooms = Room.objects.all()
    return render(request, 'room/rooms.html', {'rooms': rooms})

@login_required
def room(request, slug):
    room = Room.objects.get(slug=slug)
    messages = Message.objects.filter(room=room)[0:25]
    return render(request, 'room/room.html', {'room': room, 'messages': messages})


@csrf_exempt
def delete_room(request): ## <<------ invoke this from html call.
    print("hey")

urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.rooms, name='rooms'),
    path('<slug:slug>/', views.room, name='room'),
    path('', views.delete_room, name='delete_room'),
]

теперь у меня больше 2 urls.py, проект имеет 3 папки, 1 главная (livechatapp) с настройками и всем, одна для ядра htmls (core) и одна для комнат html (room)

core/urls

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path('', views.frontpage, name='frontpage'),
    path('signup/', views.signup, name='signup'),
    path('login/', auth_views.LoginView.as_view(template_name='core/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

и наконец

livechatapp/urls

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('core.urls')),
    path('rooms/', include('room.urls')),
    path('admin/', admin.site.urls),
]

и это обзор папок и файлов проекта : это проект

Если вы хотите сделать это в стандартном html:

% extends 'core/base.html' %}

{% block title %} Rooms | {% endblock %}

{% block content %}
<div class="main">
    <h1>Rooms</h1>
</div>
<div class="rooms-container">
    {% for room in rooms %}
        <div class="room">
            <div class="room-info">
                <h1 class="room-title">{{ room.name }}</h1>
                <a href="{% url 'room' room.slug %}" class="room-join">Join Room</a>
                {% if request.user == room.owner %}
<form method="POST" action="{% url 'delete_room' room.slug %}>
                    <button type="submit" class="room-delete">Delete Room</button></form>
                {% endif %} 
            </div>
        </div>
    {% endfor %}
</div>
{% endblock %}

{% block scripts %}
 <!-- todo: add delete room button functionality. -->
{% endblock %} ```

Урлы:

urlpatterns = [
    path('', views.rooms, name='rooms'),
    path('<slug:slug>/', views.room, name='room'),
    path('delete/<slug:slug>/', views.delete_room, name='delete_room'),
]

просмотров:

@csrf_exempt
def delete_room(request,slug):
    if request.method == 'POST':

        try:
            room = Room.objects.get(slug=slug, owner=request.user)
            room.delete()
            
        except ObjectDoesNotExist:
            print('there is no room with this slug or you are not owner')

    return redirect('rooms')

советую использовать csrf. всегда старайтесь использовать POST при манипулировании данными в базе данных.

Если вы хотите работать без редиректа, вам нужно подумать о вызове ajax или, возможно, htmx

Вернуться на верх