ailsin
ailsin

Reputation: 35

How to properly delete an instance of a model in Django

I am trying to delete an instance of an event from my calendar. I then want Django to redirect to the calendar page upon deletion of the event.

In my views.py, I have defined an event_delete function:

def event_delete(request, event_id=None):
    Event.objects.get(pk=event_id).delete()
    return HttpResponseRedirect(reverse("cal:calendar"))

In my urls.py I have defined a url for deletion:

from django.conf.urls import url
from . import views

app_name = "cal"
urlpatterns = [
    url(r"^index/$", views.index, name="index"),
    url(r"^calendar/$", views.CalendarView.as_view(), name="calendar"),
    url(r"^event/new/$", views.event, name="event_new"),
    url(r"^event/edit/(?P<event_id>\d+)/$", views.event, name="event_edit"),
    url(r"^event/delete/$", views.event_delete, name="event_delete"),
]

and in my event.html, I have defined an a tag that takes in event_delete:

<a class="btn cancel-button buttons login_btn" href="{% url 'cal:event_delete' %}" value="Delete" style="font-family:Optima;">Delete Event</a>

When I try to delete an event, it redirects me back to the calendar page but I still see the event. If I try again, it gives me the error

DoesNotExist at /event/delete/
Event matching query does not exist.

When I check in my admin however, I still see the instance of the event. Please advice as to how I can resolve this.

Edit: This is what my event.html looks like:

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

{% block title %}
Event
{% endblock %}

{% block content %}


<!--<div class="clearfix">
  <a class="btn btn-info left" href="{% url 'cal:calendar' %}"> Calendar </a>
</div>-->
{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                {{ field.label }} <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            {{ field.label }} <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}
<div class="container h-100">
  <div class="d-flex justify-content-center h-100">
    <div class="user_card">
      <div class="d-flex justify-content-center">
        <h3 id="form-title">Add Event</h3>
      </div>
      <div class="d-flex justify-content-center form_container">
        <form method="POST" action="">
          {% csrf_token %}
          <div class="input-group mb-3">
            {{ form.title }}
          </div>

          <div class="mb-3 description">
            {{ form.description }}
          </div>
          <div class="start_and_end_time">
            <span class="timelabel">Start</span>
            {{ form.start_time }}
            <span class="spacer"></span>
            <span class="timelabel">End</span>
            {{ form.end_time }}
          </div>
          <div class="d-flex justify-content-center mt-3 login_container">
            <a class="btn cancel-button buttons login_btn" href="{% url 'cal:calendar' %}" value="Cancel" style="font-family:Optima;">Cancel</a>
            <a class="btn cancel-button buttons login_btn" href="{% url 'cal:event_delete' form.id%}" value="Delete" style="font-family:Optima;">Delete Event</a>
            <span class="spacer"></span>
            <input class="btn buttons add-button login_btn" type="submit" value="Add Event" style="font-family:Optima;">
          </div>
        </form>

      </div>
    </div>
  </div>
</div>

{% endblock %}

Upvotes: 0

Views: 245

Answers (1)

mimo
mimo

Reputation: 2629

href="{% url 'cal:event_delete' %}"

Here, you are not providing the id of the event to delete, so it cannot work. Change to the following:

href="{% url 'cal:event_delete' form.instance %}"

The second problem is in your urls.py, where the delete URL should be fed with an ID in order to know what to delete. Just follow a pattern similar to the edit URL:

    url(r"^event/delete/(?P<event_id>\d+)/$", views.event_delete, name="event_delete"),

Upvotes: 2

Related Questions