Django Rest 框架访问主页时"NoReverseMatch at /"错误



只有当我向RetrieveAPIView url添加参数时才会发生此错误,如下所示:

urlpatterns = [
path('newgame/', newGame, name='newgame'),
path('gameboard<int:pk>/', GameBoardView.as_view(), name='gameboard'),
path('findgame/', findGame, name='findgame')
]

如果我用一个有效的ID去游戏板URL,一切都会正常,但如果我去http://127.0.0.1:8000/,我会得到这个:

NoReverseMatch at /
Reverse for 'gameboard' with no arguments not found. 1 pattern(s) tried: ['api/gameboard(?P<pk>[0-9]+)/$']
Request Method:     GET
Request URL:    http://127.0.0.1:8000/
Django Version:     3.1.7
Exception Type:     NoReverseMatch
Exception Value:    
Reverse for 'gameboard' with no arguments not found. 1 pattern(s) tried: ['api/gameboard(?P<pk>[0-9]+)/$']
Exception Location:     /home/calvin/.local/share/virtualenvs/Online-Chess-UxyP2_C1/lib/python3.8/site-packages/django/urls/resolvers.py, line 685, in _reverse_with_prefix
Python Executable:  /home/calvin/.local/share/virtualenvs/Online-Chess-UxyP2_C1/bin/python3
Python Version:     3.8.5
Python Path:    
['/home/calvin/Online-Chess/chess',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/home/calvin/.local/share/virtualenvs/Online-Chess-UxyP2_C1/lib/python3.8/site-packages']
Error during template rendering
In template /home/calvin/Online-Chess/chess/templates/base.html, error at line 0
Reverse for 'gameboard' with no arguments not found. 1 pattern(s) tried: ['api/gameboard(?P<pk>[0-9]+)/$']

如果我从游戏板URL中取出<int:pk>,一切都会重新开始。

这是视图:

class GameBoardView(generics.RetrieveUpdateAPIView):
permission_classes = ([IsAuthenticated])
serializer_class = GameBoardSerializer
queryset = GameBoard.objects.all()

以下是我的主要URL,以防有用:

urlpatterns = [
path('', home, name="home"),
path('<int:game_id>', game, name="game"),
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('api/', include('api.urls')),
path('rest-auth/', include('rest_auth.urls'))
]

我从其他人身上发现的所有错误似乎都是在他们试图访问自己的详细信息视图时发生的,但我的问题恰恰相反。这就像是在主页前尝试api/gameboardurl。。。

谢谢你的帮助。

编辑:添加主视图代码:

@login_required(login_url="login")
def home(request):
return render(request, "home.html")

添加home.html:

{% extends "base.html" %}
{% load static %}
{% load choosecolor %}
{% block content %}
<nav class="navbar navbar-expand-lg navbar-light fixed-top bg-light">
<div class="container-fluid">
<a class="navbar-brand pl-4" href="{% url 'home' %}">Online Chess</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDropdown">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" id="findGame">Find Game</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Account
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<li><a class="dropdown-item" href="#">Profile</a></li>
<li><a class="dropdown-item" href="#">Game History</a></li>
<li><a class="dropdown-item" href="#">Logout</a></li>
</ul>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
Your Rating:
</li>
</ul>
</div>
</div>
</nav>
<div class="row pt-5"></div>
<div class="row">
<div class="xl-col-10 l-col-11 m-col-12">
<div class="container" id="board">
<div class="row mt-2 no-gutters border border-primary">
{% for col in '01234567' %}
{% for row in '01234567' %}
{% if row == '0' %}
<div class="col">
{% endif %}
<div class={{row|choosecolor:col}} id="{{row}},{{col}}"></div>
{% if row == '7' %}
</div>
{% endif %}
{% endfor %}
{% endfor %}
<div class="col-4"></div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
const newGameUrl = '{% url 'api:newgame' %}';
const boardUrl = '{% url 'api:gameboard' %}';
const findGameUrl = '{% url 'api:findgame' %}';
</script>
<script src={% static "js/game.js" %}></script>
{% endblock content %}

和base.html:

{% load static %}
<!doctype html>
<html lang="en">
<head>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">

<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href={% static "style.css" %}>

<link rel="shortcut icon" type="image/png" href={% static "images/favicon.png" %}>
<title>Chess</title>
</head>
<body>
{% block content %}{% endblock content %}
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>
<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.6.0/dist/umd/popper.min.js" integrity="sha384-KsvD1yqQ1/1+IA7gi3P0tyJcT3vR+NdBTt13hSJ2lnve8agRGXTTyNaBYmCR/Nwi" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.min.js" integrity="sha384-nsg8ua9HAw1y0W1btsyWgBklPnCUAFLuTMS2G72MMONqmOymq585AcH49TLBQObG" crossorigin="anonymous"></script>
-->
</body>
</html>

尝试更改此行:

path('gameboard<int:pk>/', GameBoardView.as_view(), name='gameboard'),

用另一种方式来放置参数:

path('gameboard(P<int:pk[0-9]+)>/', GameBoardView.as_view(), name='gameboard'),

相关内容

最新更新