如何创建删除按钮以在 django 中删除记录

时间:2021-01-17 14:54:01

标签: django

我正在尝试删除记录 我的 views.py 文件是

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') 

我的 html 文件是

{% 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%}

我的 url.py 文件有模式

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

我想删除记录的模型是

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

当我尝试访问 http://127.0.0.1:8000/classroom/delete/1/

它给了我以下错误

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

另外,我是 Django 的初学者,对 url(r'^delete/(?P<pk>[0-9]+)/$', views.AnnouncementDelete, name='AnnouncementDelete'), 方式不是很熟悉。我一般使用 ```path`` 方式。

编辑 这是上传作业的视图

 @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})            

这是显示所有作业的视图

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

2 个答案:

答案 0 :(得分:0)

您可以丢弃 url() 行并为此使用 path() 变体:

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

如果这不能解决您的问题,请返回呈现删除页面的视图。

答案 1 :(得分:0)

在您的 html 模板中,您使用了一个从未从您的视图中传递的变量 (announcement)。

如果我认为这是正确的,你应该改变你的观点:

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.

你没有要求这个但是...

由于您在问题中提到大多数时候使用 path,我假设您只是想测试 url。 关于 url 变体的正确使用,请查看 this answer