【问题标题】:NoReverseMatch at /category/clothes/ Django class based viewsNoReverseMatch 在 /category/clothes/ 基于 Django 类的视图
【发布时间】: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.htmlviews.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_slugsubcategory_slug 来传递给

&lt;a href="{% url 'products-app:product-list' category_slug subcategory_slug %}"&gt;{{ object.name }}&lt;/a&gt;.

我不知道如何实现这个逻辑来使用 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 以便我可以在模板上对其进行迭代?

【问题讨论】:

    标签: django django-models django-urls django-class-based-views slug


    【解决方案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 &lt;a href="{% url 'products-app:product-list' category_slug object.subcategory_slug %}"&gt;{{ object.name }}&lt;/a&gt;.

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 2014-02-21
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 2018-05-14
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多