Reputation: 35
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
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