NoReverseMatch 在 /category/clothes/ 基于 Django 类的视图
Posted
技术标签:
【中文标题】NoReverseMatch 在 /category/clothes/ 基于 Django 类的视图【英文标题】:NoReverseMatch at /category/clothes/ Django class based views 【发布时间】:2017-03-19 08:16:01 【问题描述】:我有一个 django 项目,在功能上接近电子商务网站。
有四个页面链接彼此。第一页显示 Categories、第二个 Subcategories、第三个 Product list 和第四个 Product detail,我正在使用 >蛞蝓导航。
错误
Reverse for 'product-list' with arguments '('', 'women-clothes')' and keyword arguments '' not found. 1 pattern(s) tried: ['category/(?P<category_slug>[-\\w]+)/(?P<subcategory_slug>[-\\w]+)/$']
category_list.html 和 views.py 上的类别到子类别链接代码为 <a href="% url 'products-app:sub-category' category.category_slug %"> category.name </a>
class CategoryListView(ListView):
models = Category
template_name = 'products/category_list.html'
context_object_name = "Category list"
def get_queryset(self):
"""
Returns all categories.
"""
return Category.objects.get_queryset().all()
和 urls.py
app_name = 'products'
urlpatterns = [
url(r'^$', CategoryListView.as_view(), name='categories'),
url(r'^(?P<category_slug>[-\w]+)/$', SubcategoryListView.as_view(), name='sub-category'),
url(r'^(?P<category_slug>[-\w]+)/(?P<subcategory_slug>[-\w]+)/$', ProductListView.as_view(), name='product-list'),
url(r'^(?P<category_slug>[-\w]+)/(?P<subcategory_slug>[-\w]+)/(?P<pk>\d+)/$', ProductDetailView.as_view(), name='product-detail'),]
问题在于将 subcategory_list.html 链接到 product_list。因为我需要一个 category_slug 和 subcategory_slug 来传递给
<a href="% url 'products-app:product-list' category_slug subcategory_slug %"> object.name </a>
.
我不知道如何实现这个逻辑来使用 cbv。我想传递 category_slug,因为它来自 Category 模型 并从 Subcategory 模型 查询。 views.py
class SubcategoryListView(ListView):
"""
Browse all products in the sub-catalogue.
"""
model = Subcategory
template_name = 'products/subcategory_list.html'
context_object_name = "Sub-Category list"
category_model = Category
def get_queryset(self):
"""
Returns all sub-categories.
"""
self.category = get_object_or_404(Category, category_slug = self.kwargs.get('category_slug'))
return Subcategory.objects.filter(category = self.category)
category.html 有效。
% for category in object_list %
<div class="col-xs-12 col-md-12">
<a href="% url 'products-app:sub-category' category.category_slug %"> category.name </a>
<p> category.category_slug </p>
</div>
% endfor %
subcategory.html
% for object in object_list %
<div class="col-xs-12 col-md-12">
<a href="% url 'products-app:product-list' object.category_slug object.subcategory_slug %"> object.name </a>
<p>subcategory_slug: object.subcategory_slug </p>
</div>
% endfor %
如何获取 category_slug 并将其传递到上面的 view 以便我可以在模板上对其进行迭代?
【问题讨论】:
【参考方案1】:我真的不明白这与 CBV 有什么关系。您没有显示太多模板,但大概您正在迭代子类别并希望链接到该子类别的单个列表页面。因此,您只需在循环中传递当前子类别的 slug 和类别 slug。
如果您显示模板和模型的其余部分,这会更容易,但假设 object
是子类别,带有一个名为“subcategory_slug”的字段,并且 SubCategory 模型具有类别的 FK:
<a href="% url 'products-app:product-list' object.category.category_slug object.subcategory_slug %"> object.name </a>
【讨论】:
【参考方案2】:我能够解决这个错误。 变化
views.py
class SubcategoryListView(ListView):
"""
Browse all products in the sub-catalogue.
"""
model = Subcategory
template_name = 'products/subcategory_list.html'
context_object_name = "Sub-Category list"
category_model = Category
def get_queryset(self):
"""
Returns all sub-categories.
"""
self.category = get_object_or_404(Category, category_slug = self.kwargs.get('category_slug'))
return Subcategory.objects.filter(category = self.category)
def get_context_data(self, **kwargs):
"""
Returns self.category_slug needed
on the subcategory_list.html as a
one of the % url % slug params.
"""
context = super(SubcategoryListView, self).get_context_data(**kwargs)
context['categories'] = Category.objects.all()
context['category_slug'] = self.kwargs.get('category_slug')
return context
在 subcategory_list.html 上,我将 object.category_slug 更改为 category_slug。
subcategory_list.html
<a href="% url 'products-app:product-list' category_slug object.subcategory_slug %"> object.name </a>
.
【讨论】:
以上是关于NoReverseMatch 在 /category/clothes/ 基于 Django 类的视图的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中使用 % url % 时的 NoReverseMatch
NoReverseMatch 在 /sessions/exercise/6/update/