Python 在django中删除数据库对象-如何正确创建删除函数?
我正在构建我的第一个solo django项目,我遇到的一个障碍是创建一个“delete函数”,这样我就可以删除数据库中的对象。我一直在看这方面的各种教程,但一路上我有点困惑。我真的很感激任何关于如何在django中正确执行此操作的建议。这是我到目前为止一直在做的事情 我有一个叫“我的团队”的模型,看起来像这样Python 在django中删除数据库对象-如何正确创建删除函数?,python,django,django-models,Python,Django,Django Models,我正在构建我的第一个solo django项目,我遇到的一个障碍是创建一个“delete函数”,这样我就可以删除数据库中的对象。我一直在看这方面的各种教程,但一路上我有点困惑。我真的很感激任何关于如何在django中正确执行此操作的建议。这是我到目前为止一直在做的事情 我有一个叫“我的团队”的模型,看起来像这样 class Myteam(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE, nu
class Myteam(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
QB = models.CharField(max_length=80, null=True)
QBscore = models.IntegerField(null=True)
RB1 = models.CharField(max_length=80, null=True)
RB1score = models.IntegerField(null=True)
RB2 = models.CharField(max_length=80, null=True)
RB2score = models.IntegerField(null=True)
WR = models.CharField(max_length=80, null=True)
WR1score = models.IntegerField(null=True)
WR2 = models.CharField(max_length=80, null=True)
WR2score = models.IntegerField(null=True)
TE = models.CharField(max_length=80, null=True)
TEscore = models.IntegerField(null=True)
D = models.CharField(max_length=80, null=True)
Dscore = models.IntegerField(null=True)
K = models.CharField(max_length=80, null=True)
Kscore = models.IntegerField(null=True)
在我看来,昨天,我试过这个
def delete_player(request, pk):
player = Myteam.objects.get(pk=id)
if request.method == 'POST':
player.delete()
return HttpResponseRedirect(reverse("index"))
return render(request, 'game/index.html')
这是我的URL.py
path('delete_player/<str:pk>', views.delete_player, name="delete_player")
path('delete\u player/',views.delete\u player,name=“delete\u player”)
对于html,我最初尝试创建一个指向delete_player函数的按钮链接,但是我所看到的许多教程都使用了带有提交的表单,所以我尝试了一下(这只是原始的、大得多的表的一小部分)
{%csrf_令牌%}
QB
{{team.QB}}
{{QBscore}}
这是一个屏幕截图,显示了桌子/前端的情况。基本上,我希望能够从数据库中的Myteam模型中删除玩家。理想情况下,我将为此启用按钮,“提交”按钮是我最近尝试的上述实验的一部分,我无法开始工作。
没有指向正在删除对象的窗体和视图的链接。当用户单击delete按钮时,您可以将其重定向到您的视图(表单可以是一个简单的提示,如Doyouwantdelete)
{%csrf_令牌%}
QB
{{team.QB}}
{{QBscore}}
或将操作URL添加到表单中
<form action ="delete_player/<str:pk>" methos = "POST">
...
</form>
...
用于捕获PK的JS
<script>
const ele =document.getElementById('idOFSubmitButton')
ele.addEventListener('click',(e)=>{
document.myform.action = `delete_player/${e.target.pk}/`
document.myform.submit()
})
</script>
const ele=document.getElementById('idOFSubmitButton')
ele.addEventListener('单击',(e)=>{
document.myform.action=`delete_player/${e.target.pk}/`
document.myform.submit()文件
})
HTML中的按钮应该有一个属性PK,它应该是您要删除的玩家的ID
<form action="" method="POST">
{% csrf_token %}
<table style="border: 1px solid black;">
<tr>
<td style="border: 1px solid black;">QB</td>
<th style="border: 1px solid black;">{{ team.QB }} <a href="{% url 'delete_player' pk=player.id %}">Delete</a></th>
<th style="border: 1px solid black;"></th>
<th style="border: 1px solid black;">{{ QBscore }}</th>
<th style="border: 1px solid black;"></th>
</tr>
</table>
</form>
理想情况下,我会选择第一个选项,因为如果有人错误地单击按钮,您不会希望删除对象。有任何错误吗?没有,只是什么也没有发生。在
def delete\u player
中添加一个打印语句,然后查看它是否出现在控制台中。顺便说一句,您想检查请求查看的用户是否是被删除的用户。否则,任何人都可以通过调用url来删除您的所有用户。我现在只有Myteam模型。@Hansteffranz刚刚尝试输入一条打印语句,但控制台中不会出现它。很好。我试过了,但得到了以下错误:找不到关键字参数为“{pk':”}”的“delete_player”的/game/Reverse处的NoReverseMatch。尝试了1个模式:['game/delete_player/(?P[^/]+)$”]@user14593966(如果您使用操作URL)。你必须通过实际的pk,而不是仅仅通过pk。您可以使用JS捕获PK。@user14593966我在最初的回答中添加了一些使用JS捕获PK的代码,但我认为这不是一个好方法,我建议您查看泛型类视图和我提到的第一个方法。我感谢你在这里的帮助。我不知道你说的“抓捕PK”是什么意思。
<script>
const ele =document.getElementById('idOFSubmitButton')
ele.addEventListener('click',(e)=>{
document.myform.action = `delete_player/${e.target.pk}/`
document.myform.submit()
})
</script>