Python Django中的删除函数不工作

Python Django中的删除函数不工作,python,django,django-views,Python,Django,Django Views,我正在尝试为我的训练模型创建删除功能。 这就是模型: class Workout(models.Model): workoutID = models.AutoField(primary_key=True) name = models.CharField(max_length=40) created_by = models.ForeignKey(User) description = models.TextField() created_at = mo

我正在尝试为我的训练模型创建删除功能。 这就是模型:

class Workout(models.Model):
    workoutID = models.AutoField(primary_key=True)
    name = models.CharField(max_length=40)
    created_by = models.ForeignKey(User)
    description = models.TextField()   
    created_at = models.DateTimeField(auto_now_add=True)

    def delete(self):
        return reverse("delete_workout", kwargs = {'workout_id': self.workoutID})
接下来我有一个观点:

def delete_workout(request, workout_id):
    workout = get_object_or_404(Workout, workoutID = workout_id)
    print(workout)
    if request.user != workout.created_by:
        return HttpResponse('Not ur workout')
    else:
        workout.delete()
        return HttpResponseRedirect('/')
这是url:

url(r'^(?P<workout_id>\d+)/delete/$', views.delete_workout, name='delete_workout'),  
url(r'^(?P\d+)/delete/$,views.delete\u锻炼,name='delete\u锻炼〕,
最后是html:

<a href='{{ instance.delete }}'>
    <button>Delete Workout</button> 
</a>


我在控制台中没有收到任何错误,这就是为什么我不知道出了什么问题。

Django为您提供了所有的工具。不要重新发明轮子。您可以重构和简化代码

首先删除
训练
中的方法
删除

其次,将基于函数的视图替换为基于类的视图:

from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from django.http import Http404

from .models import Workout

class WorkoutDeleteView(DeleteView):
    model = Workout
    success_url = reverse_lazy('delete_workout')

    def get_object(self):
        obj = super().get_object()
        if obj.created_by != self.request.user:
            raise Http404
        return obj
训练只能由其作者删除。在
success\u url
中,指定删除后应重定向用户的目标

只需稍微调整你的
url.py
(注意强调的部分):

url(r'^(?P\d+)/delete/$,视图。WorkoutDeleteView.as_view(),name='delete_-workout'),
编辑:
您可以随意命名您的视图,但是最好遵循已经建立的惯例。因此,基于类的视图的名称应该是
训练列表
训练详细信息
训练创建
训练更新
训练删除
您正在覆盖类的删除方法,只是为了获取删除url。您将在模板中通过url函数获取url,如
{%url delete\u workout instance.workoutID%}
。因此,请从模型中删除删除函数并更改您的html href url。保持视图和url相同。没有问题

班级应该是

class Workout(models.Model):
    workoutID = models.AutoField(primary_key=True)
    name = models.CharField(max_length=40)
    created_by = models.ForeignKey(User)
    description = models.TextField()   
    created_at = models.DateTimeField(auto_now_add=True)
<a href='{% url delete_workout instance.workoutID %}'>
    <button>Delete Workout</button> 
</a>
你的html应该是

class Workout(models.Model):
    workoutID = models.AutoField(primary_key=True)
    name = models.CharField(max_length=40)
    created_by = models.ForeignKey(User)
    description = models.TextField()   
    created_at = models.DateTimeField(auto_now_add=True)
<a href='{% url delete_workout instance.workoutID %}'>
    <button>Delete Workout</button> 
</a>
而html将是

<a href='{% url delete_workout instance.id %}'>
    <button>Delete Workout</button> 
</a>


我强烈建议您使用基于类的视图(
DeleteView
)并阅读模型的文档。你在
训练中的
删除
方法非常混乱,完全是反模式的。关于主键的观点非常好。我一眼就没注意到。许多初学者在使用框架时会重新发明轮子,这违背了使用框架的目的