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
)并阅读模型的文档。你在训练中的删除方法非常混乱,完全是反模式的。关于主键的观点非常好。我一眼就没注意到。许多初学者在使用框架时会重新发明轮子,这违背了使用框架的目的