Skip to main content
 首页 » 编程设计

python之Django 中的删除功能不起作用

2025年01月19日44dyllove98

我正在尝试为我的锻炼模型创建一个删除功能。 这是模型:

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(r'^(?P<workout_id>\d+)/delete/$', views.delete_workout, name='delete_workout'),   

最后是 html:

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

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

请您参考如下方法:

您正在覆盖类的删除方法只是为了获取删除 url。您将通过模板中的 url 函数获取 url,如 {% url delete_workout instance.workoutID %}。因此,从模型中删除删除功能更改您的 html href url。保持 View 和 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) 

你的 html 应该是

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

注意:django 模型本身会为每个表添加 id,因此您不必像workoutID = models.AutoField(primary_key=True) 那样指定它。 默认情况下,每个模型都有一个 id 字段,就像 id = models.AutoField(primary_key=True)

如果您考虑删除 workoutID,则模型变为

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

html 将是

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