NoReverseMatch 在 /basketball/ Reverse for 'detail' 没有找到参数 '('',)'。尝试了 1 种模式:

NoReverseMatch at /basketball/ Reverse for 'detail' with arguments '('',)' not found. 1 pattern(s) tried:

我有一个 Django 应用程序,用户可以在其中使用 Basketball 模型创建一个 Basketball 对象,然后 post 将其添加到作为 ListView 子类的供稿中。然后,我希望其他用户能够通过单击该对象的超链接来访问该 post 的详细信息。

问题是,当我将详细信息页面的 url 设置为包含变量 "slug" 作为对象 slug 时,它会用 url 路由覆盖我的列表页面“ " 正如在 basketball/urls.py 中看到的那样,它没有路由到列表页面,而是说找不到带有空 slug 的页面。这不允许我进入 url“http://127.0.0.1:8000/basketball/

我的印象是 Django 按顺序搜索 url 路由,因此由于空白路径是第一条路由,因此应该在包含 slug 的路由之前看到它。

请注意,直接导致问题的代码段位于 basketball_list.html:

<a href= "{% url 'basketball:detail' basketball.slug %}">

删除此代码后,我可以访问“http://127.0.0.1:8000/basketball/”,但超链接不存在,因此达不到目的。

请注意,我正在使用: Python == 3.8.3 Django == 3.0.6

models.py:

from django.db import models

from django.db import models
from django.urls import reverse
from django.conf import settings
from django.utils.text import slugify

from autoslug import AutoSlugField
from model_utils.models import TimeStampedModel

from nba_api.stats.static import players

PLAYER_CHOICES = [(i['full_name'], i['full_name']) for i in players.get_active_players()]

class Basketball(TimeStampedModel):
    player = models.CharField(max_length = 50, choices = PLAYER_CHOICES, default = None)
    slug = AutoSlugField("Basketball Player", unique = True, populate_from ="player")
    creator = models.ForeignKey(settings.AUTH_USER_MODEL,
    null = True,
    on_delete = models.SET_NULL
    )

    def get_absolute_url(self):
        return reverse(
        'basketball:detail', kwargs={'slug': self.slug}
        )

    def __str__(self):
        return f"{self.creator} posted about: {self.player}"

views.py:

from django.shortcuts import render
from django.views.generic import ListView, CreateView, DetailView
from django.contrib.auth.mixins import LoginRequiredMixin

from .models import Basketball

class BasketballListView(LoginRequiredMixin, ListView):
    model = Basketball


class BasketballDetailView(DetailView):
    model = Basketball

class BasketballCreateView(LoginRequiredMixin, CreateView):
    model = Basketball
    fields = [
    'player',
    ]

    def form_valid(self, form):
        form.instance.creator =self.request.user
        return super().form_valid(form)

urls.py:

# wtg/basketball/urls.py
from django.urls import path
from . import views


app_name = "basketball"
urlpatterns = [
    path(
    route='',
    view=views.BasketballListView.as_view(),
    name='list',
    ),
    path(
    route='add/',
    view=views.BasketballCreateView.as_view(),
    name='add',
    ),
    path(
    route='<slug:slug>/',
    view=views.BasketballDetailView.as_view(),
    name='detail'
    ),
]

basketball_list.html:

{% extends 'base.html' %}

{% block title %}Basketball List{% endblock title %}

{% block content %}
  <h2>Basketball List</h2>

<ul>
  {% for x in basketball_list %}
    <li><a href= "{% url 'basketball:detail' basketball.slug %}">{{ x }}</a></li>

  {% endfor %}
</ul>

<hr/>
<p>Post Own Info?</p>
  <p>
    <a class="btn btn-primary"
      href="{% url 'basketball:add' %}" role="button">
      Add Post
    </a>
</p>
{% endblock content %}

基础urls.py:

urlpatterns = [
    path(
        "",
        TemplateView.as_view(template_name="pages/home.html"),
        name="home",
    ),
    path(
        "about/",
        TemplateView.as_view(template_name="pages/about.html"),
        name="about",
    ),
    # Django Admin, use {% url 'admin:index' %}
    path(settings.ADMIN_URL, admin.site.urls),
    # User management
    path(
        "users/",
        include("wtg.users.urls", namespace="users"),
    ),
    path("accounts/", include("allauth.urls")),
    # Your stuff: custom urls includes go here
    path(
    'basketball/',
    include('wtg.basketball.urls', namespace='basketball')
    ),
    path(
    "^activity/",
    include("actstream.urls")
    ),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

您的 url 与 basketball_list 循环变量 (x) 不匹配。这个

{% for x in basketball_list %}
  <li><a href= "{% url 'basketball:detail' basketball.slug %}">{{ x }}</a></li>
{% endfor %}

应该是

{% for x in basketball_list %}
  <li><a href= "{% url 'basketball:detail' x.slug %}">{{ x }}</a></li>
{% endfor %}