Reputation:
So I was trying to set up a DeleteView
for my Lecture
model. Each course from my Course
model has its own slug page. And on that page lectures for a course appear.
Thing is that I tried to add a delete button for lectures, but it was unsuccessful.
Here is what what I did:
#courses.html
{% regroup lectures by get_lecture_category_display as category_list %}
<h3>Lectures</h3>
<ul>
{% for category in category_list %}
<strong>
<li>{{ category.grouper }}</li>
</strong>
<ul>
{% for c in category.list %}
.............
<li>{{ c.lecture_title }}</li>
<li>{{ c.content }}</li>
{% for file in c.files.all %}
{% if file.files %}
<li><a href='{{ MEDIA_URL }}{{ file.files.url }}'>download</a></li>
{% endif %}
{% endfor %}
<a href="{% url 'courses:lecture_delete' c.slug %}">Delete</a>
{% endfor %}
</ul>
{% endfor %}
</ul>
#lecture_confirm_delete.html
<form method="post">
{% csrf_token %}
Are you sure you want to delete?
<input type="submit" value="Confirm"/>
</form>
#urls.py
path('<slug:slug>/', views.courses, name='courses'),
path('<slug:slug>/delete/', views.LectureDelete.as_view(), name='lecture_delete'),
#models.py
class Lecture(models.Model):
LECTURE_CHOICES = (
('Courses', 'Courses'),
('Seminars', 'Seminars'),
)
course = models.ForeignKey('Course', on_delete=models.CASCADE, default='', related_name='lectures', )
lecture_category = models.CharField(max_length=10, choices=LECTURE_CHOICES, default='Courses', )
lecture_title = models.CharField(max_length=100, blank=True, null=True)
content = models.TextField(blank=False, default=No
class Course(models.Model):
study_programme = models.ForeignKey('StudyProgramme', on_delete=models.CASCADE, default='')
name = models.CharField(max_length=50, unique=True)
ects = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
description = models.TextField()
year = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
semester = models.IntegerField(choices=((1, "1"),
(2, "2"),
), default=None)
teacher1 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None,
verbose_name="Course Teacher", related_name='%(class)s_course_teacher')
teacher2 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None, null=True,
verbose_name="Seminar Teacher", related_name='%(class)s_seminar_teacher')
slug = models.SlugField(max_length=140, unique=True)
Problem is this:
If in courses.html link I put c.slug
, then I get this error: http://dpaste.com/1K1T8N8
But If I put c.id
or c.pk
, then page will show and if I press delete button I get this error: http://dpaste.com/3TRSJE2
Here is my view:
class LectureDelete(DeleteView):
model = Lecture
success_url = reverse_lazy('courses:index')
Upvotes: 1
Views: 1211
Reputation: 13047
There is no any field as slug
in your model.
You just need to do:
path('<int:id>/delete/', views.LectureDelete.as_view(), name='lecture_delete'),
and in href
href="{% url 'courses:lecture_delete' c.id %}"
Upvotes: 1