Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中删除数据库对象-如何正确创建删除函数?_Python_Django_Django Models - Fatal编程技术网

Python 在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

我正在构建我的第一个solo django项目,我遇到的一个障碍是创建一个“delete函数”,这样我就可以删除数据库中的对象。我一直在看这方面的各种教程,但一路上我有点困惑。我真的很感激任何关于如何在django中正确执行此操作的建议。这是我到目前为止一直在做的事情

我有一个叫“我的团队”的模型,看起来像这样

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>