user14011678
user14011678

Reputation:

Problem in creating delete button in django

I am trying to build delete button and currently stuck. I am new to django and need help. Thank You

This is my models.py:-

    from django.db import models
    from django.contrib.auth import get_user_model
    from django.db import models
    from django.urls import reverse
    # Create your models here.
    
    
    class simpleList(models.Model):
        title = models.CharField(max_length=250)
    
        def __str__(self):
            return self.title

This is my views.py:-

from django.shortcuts import render, get_object_or_404
from .models import simpleList
from django.views.generic import ListView, DeleteView
from django.urls import reverse_lazy
from django.contrib.messages.views import SuccessMessageMixin
# Create your views here.


class ListListView(ListView):
    model = simpleList
    template_name = 'list_list.html'


class DeleteList(SuccessMessageMixin, DeleteView):
    model = simpleList
    success_url = '/'
    success_message = "deleted..."

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        name = self.object.title
        # name will be change according to your need
        request.session['title'] = title
        message = request.session['title'] + ' deleted successfully'
        messages.success(self.request, message)
        return super(DeleteView, self).delete(request, *args, **kwargs)

This is my urls.py:-

from django.urls import path
from .views import ListListView, DeleteList
from django.conf.urls import url
from . import views


urlpatterns = [
    path('', ListListView.as_view(), name='list_list'),
    path('<int:pk>/', DeleteList.as_view(), name='delete_view'),
]

This is my home.html:-

{% extends 'base.html' %}

{% block title %}Home{% endblock title %}

{% block content %}
<div>
    {% if user.is_authenticated %}
    <button type="button" class="btn btn-info"><a style="color: white;" href="{% url 'list_list' %}">Continue to
            slist</a></button>
    {% endif %}
</div>
{% endblock content %}

and this is my list_list.html which is currently not complete:-

{% extends 'base.html' %}

{% block title %}sList{% endblock title %}

{% block content %}
<h2>simpleList</h2>
{% for simpleList in object_list %}
<div>
    <h3>{{ simpleList.title }}</h3>
    <div>
        <form action="{% url 'delete_view' pk=part.pk %}">{% csrf_token %}
            X<input class="btn btn-default btn-danger" type="submit" value="Delete" />
        </form>
    </div>
</div>
{% endfor %}

{% endblock content %}

The error i am getting from django is this:-

NoReverseMatch at /list/ Reverse for 'delete_view' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['list/(?P[0-9]+)/$']

10  <body>
11      <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
12          <a class="navbar-brand" href="{% url 'home' %}">simpleList</a>
13          <div class="collapse navbar-collapse" id="navbarColor01"></div>
14          {% if user.is_authenticated %}
15          <button type="button" class="btn btn-secondary">Hi, {{ user.username }}</button>
16          <button type="button" class="btn btn-info"><a style="color:white;" href="{% url 'logout' %}">Logout</a></button>

Upvotes: 1

Views: 165

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476584

You need to make a POST request to delete the object. Furthermore the name of the object is simpleList, not part, so the form should be rewritten to:

<form method="post" action="{% url 'delete_view' pk=simpleList.pk %}">
    {% csrf_token %}
    <input class="btn btn-default btn-danger" type="submit" value="Delete" />
</form>

While it is not a problem to use <int:pk>/ as the path pattern. It might be better to use <int:pk>/delete, for example, since <int:pk>/ is often used to show the details of the object with that primary key:

urlpatterns = [
    path('', ListListView.as_view(), name='list_list'),
    path('<int:pk>/delete/', DeleteList.as_view(), name='delete_view'),
]

Upvotes: 2

Related Questions