Обратное значение для категории без аргументов не найдено. 1 шаблон (ов) пробовал: ['products / category / (? P <hierarchy>. +) / $'] - PullRequest
0 голосов
/ 07 марта 2020

Я использую django 3 и только что добавил код для подкатегорий в моей модели и представлении, но я получаю эту ошибку. Я думаю, что мне не хватает изменения структуры кода, потому что учебник был для django 1.x, но я не смог его найти.

models.py:

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField()
    parent = models.ForeignKey(
        'self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('slug', 'parent',)
        verbose_name_plural = "categories"

    def __str__(self):
        full_path = [self.name]
        k = self.parent
        while k is not None:
            full_path.append(k.name)
            k = k.parent
        return ' -> '.join(full_path[::-1])


class Product(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(verbose_name='desription')
    slug = models.SlugField()
    image = models.ImageField(upload_to='product_pics', default='default.jpg')
    category = models.ForeignKey(
        'Category', null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('product-detail', kwargs={'slug': self.slug})

    def get_cat_list(self):
        k = self.category
        breadcrumb = ["dummy"]
        while k is not None:
            breadcrumb.append(k.slug)
            k = k.parent
        for i in range(len(breadcrumb)-1):
            breadcrumb[i] = '/'.join(breadcrumb[-1:i-1:-1])
        return breadcrumb[-1:0:-1]

view .py:

def show_category(request, hierarchy=None):
    category_slug = hierarchy.split('/')
    category_queryset = list(Category.objects.all())
    all_slugs = [x.slug for x in category_queryset]
    parent = None
    for slug in category_slug:
        if slug in all_slugs:
            parent = get_object_or_404(Category, slug=slug, parent=parent)
        else:
            instance = get_object_or_404(Product, slug=slug)
            breadcrumbs_link = instance.get_cat_list()
            category_name = [' '.join(i.split('/')[-1].split('-'))
                             for i in breadcrumbs_link]
            breadcrumbs = zip(breadcrumbs_link, category_name)
            return render(request, "product_detail.html", {'instance': instance, 'breadcrumbs': breadcrumbs})

    return render(request, "product_list.html", {'product_set': parent.product_set.all(), 'sub_categories': parent.children.all()})

urls.py:

urlpatterns = [
    path('', ProductsListView.as_view(), name='product-list'),
    path('category/<path:hierarchy>/', show_category, name='category'),
]

мой основной файл URL включил этот файл, и в нем есть '/ products /'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...