我有一个Django应用,用户可以在其中使用Basketball模型创建Basketball对象,并将其发布到ListView子类的feed中。然后,我希望其他用户能够通过单击对象的超链接来访问该帖子的详细信息。
问题是,当我将详细信息页面的url设置为包含变量“ slug”作为对象slug时,它将用url路由“”覆盖我的列表页面,如篮球/urls.py所示,而不是路由到列表页面,它说找不到带有空子弹的页面。这不允许我进入网址“ http://127.0.0.1:8000/basketball/”
我的工作印象是Django依次搜索url路由,因此由于空路径是第一个路径,因此应该在包含该段的路径之前看到它。
请注意直接导致该问题的代码段在Basketball_list.html中:
<a href= "{% url 'basketball:detail' basketball.slug %}">
删除此代码后,我可以访问“ http://127.0.0.1:8000/basketball/”,但超链接不存在,因此无法达到目的。
请注意,我正在使用:Python == 3.8.3Django == 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)
您的网址与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 %}