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 %}
我有一个 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 %}