1

我有一个django在功能方面接近电子商务网站的项目。NoReverseMatch at/category/clothes/Django class based views

有四页链接彼此。第一页显示分类,第二小类,第3 产品列表和第4 产品详细和我使用蛞蝓导航。

ERROR 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链接码是<a href="{% url 'products-app:sub-category' category.category_slug %}">{{ category.name }}</a>并且在views.py

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.htmlproduct_list。因为我需要一个category_slugsubcategory_slug要传递给

<a href="{% url 'products-app:product-list' category_slug subcategory_slug %}">{{ object.name }}</a>

我不知道如何实现这个逻辑来使用cbv。我想通过category_slug因为它是从类别模型和查询从子类别模型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,并通过它上面视图所以,我可以对他们进行迭代的模板?

回答

1

我真的不明白这与CBV有什么关系。您没有显示太多的模板,但大概您正在迭代子类别,并且想要链接到该子类别的单个列表页面。所以,你只需要在你的循环中传递子弹和当前子类别的子弹。

,如果你显示你的模板,你的模型中,这家会更容易些,但假设object是子类,一个叫“subcategory_slug`场,和子类别模型有一个FK类别:

<a href="{% url 'products-app:product-list' object.category.category_slug object.subcategory_slug %}">{{ object.name }}</a> 
+0

我已经更新了这两个文件。 @Daniel Roseman –

-1

我能够解决这个错误。 变化

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_slugcategory_slug

subcategory_list.html <a href="{% url 'products-app:product-list' category_slug object.subcategory_slug %}">{{ object.name }}</a>