django - 访问主页时 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]+)/$']
如果我<int:pk>
从游戏板 URL 中取出,一切都会再次运行。
这是视图:
class GameBoardView(generics.RetrieveUpdateAPIView):
permission_classes = ([IsAuthenticated])
serializer_class = GameBoardSerializer
queryset = GameBoard.objects.all()
这是我的主要网址,以防万一:
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/gameboard
主页之前的网址......
感谢您的任何帮助。
编辑:添加主视图代码:
@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'),
推荐阅读
- python - Python:具有开始日期和结束日期的数据框,解压缩为 1 个日期字段
- php - 选择日期在 where 条件下的记录并根据每个日期对结果进行分组
- azure - 为什么 app Insights 交易明细会有空白
- python - ValueError: Tensor Tensor("mrcnn_detection/Reshape_1:0", shape=(1, 100, 6), dtype=float32) 不是该图的元素
- javascript - 发生未处理的异常:未知的浏览器查询
- laravel - 从父组件获取数据 - laravel7
- php - 为什么 hasOneThrough 会显示不合适的数据?
- javascript - 自带命名的网页加密 aes/cbc/pkcs5padding 函数
- flutter - 仅将日期限制为财政年度-颤振
- prolog - (>)/2 的参数 2 中的实例化错误