首页 > 解决方案 > 访问主页时 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>

标签: djangorest

解决方案


尝试更改此行:

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

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

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

推荐阅读