Как получить данные с помощью id или pk в django

Я работаю над проектом, но после многократных попыток я так и не смог найти решение, мне нужно получить текущую комнату на странице, чтобы пользователь мог покинуть комнату, я знаю, что это связано с запросами или использованием pk,id. (Мой первый вопрос в жизни, извините, если не правильно задал вопрос).

**Views.py:
def leave_room(request, room):
    room = request.GET['room.pk']
    room_details = Room.objects.get(name=room)
    messages = Messages.objects.filter(room=room_details.pk)
    membership = RoomMember.objects.filter(user=request.user, room=messages)
    membership.delete()
    return redirect("/")

urls.py:
    path("leave/<int:pk>/join/", views.leave_room, name="leave_room"),

html:
    <a class="btn btn-danger" href="{% url 'leave_room' pk=room.pk %}">Leave Room</a>

models.py:
class Room(models.Model):
    name = models.CharField(max_length=100)
    about = models.TextField(max_length=500, null=True, blank=True)
    creator = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='room_creator')
    members = models.ManyToManyField(User, through="RoomMember")


class RoomMember(models.Model):
    approved = models.BooleanField(default=False, blank=False)
    room = models.ForeignKey(Room, related_name='memberships', on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name='user_groups', on_delete=models.CASCADE)

    

class Messages(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
text = models.CharField(max_length=10000, blank=False, null=False)
    date = models.DateTimeField(default=datetime.now)
    room = models.ForeignKey(Room, null=True, blank=False, on_delete=models.CASCADE)

**

Поскольку у вас есть параметр <int:pk>, первичный ключ комнаты передается через параметр pk. Это означает, что leave_room должно быть реализовано как:

from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST

@require_POST
@login_required
def leave_room(request, pk):
    nitems, __ = RoomMember.objects.filter(
        user=request.user, room_id=pk
    ).delete()
    if not nitems:
        raise Http404
    else:
        return redirect('name-of-some-view')

Таким образом, ссылка на удаление является мини-формой для выполнения POST-запроса к представлению:

<form method="post" action="{% url 'leave_room' pk=room.pk %}">
    {% csrf_token %}
    <button type="submit" class="btn btn-danger">Leave Room</button>
</form>

Примечание: Раздел 9 протокола HTTP. определяет, что запросы типа GET и HEAD должны не иметь побочных эффектов, поэтому вы не должны изменять сущности с помощью таких запросов. не должны изменять сущности с помощью таких запросов. Обычно для этого используются запросы POST, PUT, PATCH и DELETE запросы используются для этого. В этом случае вы делаете небольшой <form>, который запускает POST-запрос, или используете некоторые вызовы AJAX.


Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора @login_required декоратора [Django-doc].

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