0

I am trying to delete a record My views.py file is

def AnnouncementDelete(request, pk):
    announcement = get_object_or_404(Announcement, pk=pk)
    if request.method=='POST':
        announcement.delete()
        return redirect('/')
    return render(request, 'classroom/announcement_confirm_delete.html') 

and my html file is

{% extends "classroom/base.html" %} 
{% load crispy_forms_tags %}
{% block content %}
    <form action="{% url 'classroom:AnnouncementDelete' announcement.id %}" method="post">
        {% csrf_token %}
        <input type="submit" value="Delete cat">
    </form>
{% endblock content%}

my url.py file has the pattern

url(r'^delete/(?P<pk>[0-9]+)/$', views.AnnouncementDelete, name='AnnouncementDelete'),

and the model from where I want to delete the record is

class Announcement(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

when I am trying to access http://127.0.0.1:8000/classroom/delete/1/

it is giving me the following error

NoReverseMatch at /classroom/delete/1/
Reverse for 'AnnouncementDelete' with arguments '('',)' not found. 1 pattern(s) tried: ['classroom/delete/(?P<pk>[0-9]+)/$']

Also i am a beginner to django and not very familiar with url(r'^delete/(?P<pk>[0-9]+)/$', views.AnnouncementDelete, name='AnnouncementDelete'), way. I generally use the ```path`` way.

EDIT This is the view for uploading assignment

 @login_required
def upload_announcement(request):
    if(request.user.is_teacher==False):
        return HttpResponse("This forms requires teacher previlodge")
    else:    
        assignment_uploaded = False
        teacher = request.user.Teacher
        if request.method== 'POST':
            form = AnnouncementForm(request.POST)
            if form.is_valid():
                upload = form.save(commit=False)
                upload.teacher = teacher
                upload.save()
                assignment_uploaded = True
        else:
            form = AnnouncementForm()
        return render(request, 'classroom/announcement_form.html', {'form':form, 'assignment_uploaded':assignment_uploaded})            

This is the view for displaying all assignments

class AnnouncementListView(ListView):
    context = {
            'announcements' : Announcement.objects.all()
        }
    model  =  Announcement
    template_name = 'classroom/all_announcements.html' #<app>/<model>_<viewtype>.html
    context_object_name = 'announcements'
Areeba Akhtar
  • 137
  • 10

2 Answers2

0

You can discard the url() line and use the path() variant for this like that:

path("delete/<int:pk>/", view=views.AnnouncementDelete, name="AnnouncementDelete"),

If that doesn't solve your problem, please report back with the view that renders the delete page.

dacx
  • 824
  • 1
  • 9
  • 18
  • My page not error was because there was no forward slash after ```delete/``` worked with ```path("delete//", view=views.AnnouncementDelete, name="AnnouncementDelete"),``` – Areeba Akhtar Jan 17 '21 at 17:20
0

In your html template you are using a variable (announcement) that you never pass from your view.

If i am thinking of this right, you should change your view to:

def AnnouncementDelete(request, pk):
    announcement = get_object_or_404(Announcement, pk=pk)
    if request.method=='POST':
        announcement.delete()
        return redirect('/')
    return render(request, 'classroom/announcement_confirm_delete.html', {'announcement': announcement}) 
# this last guy over here sends the desired object to the template for rendering.

You did't ask for this but...

Since you mention in your question that you use path most of the times, i assume that you just wanted to test url. Regarding the proper use of url variant check out this answer.

Gr3at
  • 330
  • 6
  • 12