对于django错误AttributeError("Generic detail view %s must be called with either an object ""pk or a slug in the URLconf." % self.__class__.__name__)的解决
报错的原因
这个错误通常是在使用Django的通用视图时出现的。它表示在URLconf中没有提供主键或滑块。
例如,如果你使用了一个DetailView,你可能会写一个这样的URLconf:
path('article/
这个URLconf会匹配以下URL:
/article/42/
在这种情况下,主键是42。如果您在URL中省略了主键或滑块,则会出现上述错误。
为了解决这个问题,请确保在URLconf中提供主键或滑块,并在实际的URL中使用它们。
例如,如果你想要查看文章的详细信息,你可以使用以下URL:
/article/42/
如果你想要使用滑块而不是主键,你可以修改URLconf来使用滑块:
path('article/
然后,你可以使用以下URL来查看文章的详细信息:
/article/my-article-slug/
如何解决
要解决这个问题,你需要在URLconf中提供主键或滑块,并在实际的URL中使用它们。
例如,如果你使用了一个DetailView,你可能会写一个这样的URLconf:
path('article/
这个URLconf会匹配以下URL:
/article/42/
在这种情况下,主键是42。如果您在URL中省略了主键或滑块,则会出现上述错误。
为了解决这个问题,请确保在URLconf中提供主键或滑块,并在实际的URL中使用它们。
例如,如果你想要查看文章的详细信息,你可以使用以下URL:
/article/42/
如果你想要使用滑块而不是主键,你可以修改URLconf来使用滑块:
path('article/
然后,你可以使用以下URL来查看文章的详细信息:
/article/my-article-slug/
使用例子
当然,这是一个使用Django通用视图的示例:
from django.shortcuts import render
from django.views.generic import ListView, DetailView
from .models import Article
class ArticleListView(ListView):
model = Article
context_object_name = 'articles'
template_name = 'articles/article_list.html'
class ArticleDetailView(DetailView):
model = Article
context_object_name = 'article'
template_name = 'articles/article_detail.html'
这些视图使用了Django的通用视图ListView和DetailView。ListView用于显示对象列表,而DetailView用于显示单个对象的详细信息。
在这个例子中,我们使用了Article模型。我们使用`model`属性来指定模型,使用`context_object_name`属性来指定在模板中使用的上下文变量的名称,并使用`template_name`属性来指定要使用的模板。
我们还需要编写URLconf来将URL映射到这些视图。这是一个示例的URLconf:
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.ArticleListView.as_view(), name='article-list'),
path('articles//', views.ArticleDetailView.as_view(), name='article-detail'),
]
这个URLconf包含两个路径。第一个路径将URL /articles/映射到ArticleListView视图,第二个路径将URL /articles/
在这个例子中,我们使用主键来捕获文章的详细信息。例如,如果我们想查看文章42的详细信息,我们可以使用以下URL:
/articles/42/
我如果你想使用滑块而不是主键,你可以更改URLconf来使用滑块:
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.ArticleListView.as_view(), name='article-list'),
path('articles//', views.ArticleDetailView.as_view(), name='article-detail'),
]
然后,你可以使用以下URL来查看文章的详细信息:
/articles/my-article-slug/
希望这些信息能帮助你解决问题!如果你有任何其他问题或疑问,请随时告诉我。