首页 > 解决方案 > django NoReverseMatch 尝试从数据库中删除对象时

问题描述

我是 django 新手,在尝试删除项目数据库中的对象时遇到了问题。我在 views.py 中创建了一个函数,该函数应该删除传递给它的对象。问题是,我的模板似乎没有正确地将信息传递给 url,所以整个链都在中断。

这是views.py中的删除功能

def delete_player(request, id):
    quarterback = Quarterback.get(id=id)
    quarterback.delete()

    return redirect('show')

模型“Quarterback”在 models.py 中

class Quarterback(models.Model):  
    name = models.CharField(max_length=20)

在我的名为“show.html”的模板中,我有这个

<tr>  
        
    <td>{{ QB }}      
        <a href="{% url 'delete_player' quarterback.id %}">Delete</a>  
    </td> 
        
</tr> 

这是 urls.py 中的路径

path('delete_player/<int:id>', views.delete_player, name="delete_player")

这一切都不断返回“NoReverseMatch:'delete_player'的反向参数'('',)'未找到。尝试了1个模式:['game/delete_player/(?P[0-9]+)$' ]"

错误消息还一直像这样在views.py中引用我的show() ...

C:\Users\Leigh\Desktop\fantasyfootball\game\views.py, line 321, in show
        return render(request,"game/show.html", context)   …
▼ Local vars
Variable    Value
K   
'Greg Zuerlein K 10.0'
QB  
'Russell Wilson QB 41.34'
RB  
'Mark Ingram RB 31.5'
TE  
'Austin Hooper TE 18.6'
WR  
'Mike Evans WR 37.0'
context 
{'K': 'Greg Zuerlein K 10.0',
 'QB': 'Russell Wilson QB 41.34',
 'RB': 'Mark Ingram RB 31.5',
 'TE': 'Austin Hooper TE 18.6',
 'WR': 'Mike Evans WR 37.0'}
request 
<WSGIRequest: GET '/game/show'>
user    
<SimpleLazyObject: <User: admin>>

这是 views.py 中的完整 show()

def show(request): 

    user = request.user

    if user.is_authenticated: 

        try:
            QB = Quarterback.objects.values_list('name', flat="True")[0]
        except IndexError:
            QB = 'empty'

        try:
            RB = Runningback.objects.values_list('name', flat="True")[0]
        except IndexError:
            RB = 'empty'

        try:     
            WR = Widereceiver.objects.values_list('name', flat="True")[0]
        except IndexError:
            WR = 'empty'

        try:
            TE = Tightend.objects.values_list('name', flat="True")[0]
        except IndexError:
            TE = 'empty' 

        try:    
            K = Kicker.objects.values_list('name', flat="True")[0]
        except IndexError:
            K = 'empty' 


        context = {
            'QB': QB[0:],
            'RB': RB[0:],
            'WR': WR[0:],
            'TE': TE[0:],
            'K': K[0:],
        }


        return render(request,"game/show.html", context) 

我不确定 show() 函数如何以及为什么在这里相关,以及我需要在这里修复什么。看起来模板没有传递 id,因此 url 不匹配。我完全不知道如何让对象的 id 正确传递。当我在终端中使用 dbshel​​l 检查数据库中的表时,这些表带有前缀“game”(例如“game_quarterback”)(“game”是我的应用程序的名称)。我可以检查桌子里面有什么,玩家的名字在那里。还有一个 id 列。在这种情况下,如何让 id 从模板中传递?任何意见,将不胜感激。

标签: pythondjangodjango-modelsdjango-templates

解决方案


我相信问题在你看来。QB = Quarterback.objects.values_list('name', flat="True")[0]是一个字符串,实际上是 Quaterback 模型的名称字段值。因为values_list有了flat=Truereturn list,你就可以访问它的第一个元素。之后,在组装上下文时,您实际上使用了子字符串QB变量。所以,当访问QB你的模板{% url 'delete_player' QB.id %} QB中的上下文变量实际上是一个字符串,它当然没有id参数,这会导致一个空字符串,因为它是无效的变量。有关更多信息,请参阅Django 文档。因此,您需要以某种方式将 QB 模型实例传递给模板,或者它的实际id值。


推荐阅读