Estoy trabajando en un proyecto, pero después de probar varias formas, todavía no pude encontrar la solución. Necesito obtener la sala actual en la página para que el usuario pueda dejar la sala, soy consciente de que tiene que ver con hacer consultas o usar pk, id. (Mi primera pregunta, lo siento si no es la forma correcta de preguntar).
Este es el código de 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>modelos.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)Dado que tiene un parámetro <int:pk> , la clave principal de la sala se pasa a través del parámetro pk . Por lo tanto, esto significa que leave_room debe implementarse como:
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 ')El enlace de eliminación es, por lo tanto, un mini formulario para realizar una solicitud POST a la vista:
< form method="post" action="{% url 'leave_room' pk=room.pk %}" > {% csrf_token %} <button type="submit" class="btn btn-danger">Leave Room</button> </form>Nota :la sección 9 del protocolo HTTP especifica que las solicitudes como GET y HEAD no deben tener efectos secundarios, por lo que no debe cambiar entidades con tales solicitudes. Normalmente se utilizan solicitudes POST, PUT, PATCH y DELETE para esto. En ese caso, crea un pequeño
<form>que activará una solicitud POST, o usa algunas llamadas AJAX.
Nota : puede limitar las vistas a una vista para usuarios autenticados con el decorador
@login_required[Django-doc] .