get_object_或_404在Django中工作不正常

2024-06-10 15:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图获取一个带有特定slug的对象时,它给了我404页错误,但是我已经硬编码了slug名称,这很有效,我已经单独打印了slug字段,这是我之前已经测试过的。 这是视图部分:

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]
    print(all_slugs)
    print(get_object_or_404(Product, title='benz'))
    parent = None
    for slug in category_slug:
        if slug in all_slugs:
            parent = get_object_or_404(Category, slug=slug, parent=parent)
        else:
            # these 3 lines bellow:

            print(slug)
            print(get_object_or_404(Product, slug='benz'))
            instance = get_object_or_404(Product, slug=slug)

            breadcrumbs_link = instance.get_cat_list()
            breadcrumbs_name = instance.get_cat_names()
            category_name = [' '.join(i.split('/')[-1].split('-'))
                             for i in breadcrumbs_name]
            breadcrumbs = zip(breadcrumbs_link, category_name)
            return render(request, "products/product_detail.html", {'instance': instance, 'breadcrumbs': breadcrumbs})


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

这些是产品和类别模型:

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(allow_unicode=True)
    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"

    @property
    def get_products(self):
        return Product.objects.filter(category__name=self.name)

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 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]

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

Tags: nameinselfforgetreturnmodelsdef