Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

160
Vistas
Como borrar modelo filtrando con pk

Estoy tratando de eliminar un modelo completo usando pk, pero cuando hago clic en "eliminar" soy redirigido a la página dada, pero no sucede nada, el modelo aún está allí y no se elimina, pero cuando escribo 'room_name' en lugar de 'pk ' funciona, (gracias de antemano)

 *Views.py: def delete_room(request, pk): Room.objects.filter(name=pk).delete() return redirect('home') Urls.py: path("delete/<int:pk>/", views.delete_room, name="delete_room") 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) Html: <a class="btn btn-danger" href="{% url 'delete_room' pk=room.pk %}">Delete Room</a>*
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si bien la respuesta de @Willem está totalmente bien, también puedo mostrarle una forma más simple y amigable para principiantes de manejar los métodos de solicitud desde el objeto de solicitud.

 def delete_room(request): if request.method == "POST" or request.method == "DELETE": #Handle your post and delete requests here #eg, deleting as was in the question Room.objects.filter(pk=pk).delete() #user will never get in here unless they hit via .delete or .post #requests return redirect('home')
over 4 years ago · Santiago Trujillo Denunciar

0

Puede filtrar por el pk de la clave principal del elemento, por lo que:

 def delete_room(request, pk): Room.objects.filter( pk=pk ).delete() return redirect('home')

Pero no debe hacer esto para una solicitud GET. La eliminación de elementos debe realizarse mediante una solicitud POST o una solicitud DELETE.Como dice la organización W3 :

En particular, se ha establecido la convención de que los métodos GET y HEAD NO DEBEN tener el significado de realizar una acción que no sea la recuperación . Estos métodos deben considerarse "seguros" .

Si acepta solicitudes GET, los motores de búsqueda y algunos navegadores que ya recuperan enlaces de una página, pueden visitar esa vista accidentalmente y, por lo tanto, eliminar datos accidentalmente.

Por lo tanto, debe limitar los métodos HTTP con:

 from django.views.decorators.http import require_http_methods @require_http_methods(['DELETE', 'POST']) def delete_room(request, pk): Room.objects.filter(pk=pk).delete() return redirect('home')

Para el HTML, debe hacer un mini formulario como:

 <form method="post" action="{% url 'delete_room' pk=room.pk %}"> {% csrf_token %} <button type="submit" class="btn btn-danger">Delete Room</button> </form>
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda