首页 > 解决方案 > ForwardManyToOneDescriptor'对象没有属性'slug Django using reverse

问题描述

我想在模型中使用 reverse 来支持一个包含三个 slug 的 URL。但这给了我一个错误。

我的网址是这样的:site.com/category/slug/slug/slug ...>


错误:

“ForwardManyToOneDescriptor”对象没有属性“slug”

模型:

from Django.db import models
from Django.shortcuts import reverse


class Category(models.Model):
    name = models.CharField(max_length=150)
    slug = models.SlugField(unique=True, max_length=200)
    child_category = models.ForeignKey('self', max_length=150, null=True, blank=True, on_delete=models.CASCADE)
    is_child = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:brands', args=[self.slug])


class Product(models.Model):
    category = models.ManyToManyField(to=Category, related_name='products')
    name = models.CharField(max_length=150)
    slug = models.SlugField(unique=True, max_length=200)
    description = models.TextField()

    class Meta:
        ordering = ('name', 'available',)
        
    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:product_details', self.category.model.slug, self.category.model.child_category.slug, self.slug)

网址:

from Django.urls import path
from Shop import views

app_name = 'shop'

urlpatterns = [
    path('<slug:brands_slug>/', views.brands, name='brands'),
    path('<slug:brands_slug>/<slug:product_slug>/', views.products, name='products'),
    path('<slug:brands_slug>/<slug:product_slug>/<slug:product_details>/', views.details_products, name='product_details'),
]

看法:

def details_products(request, brands_slug, product_slug, product_details):
    details = Product.objects.filter(category__child_category__slug=brands_slug, category__slug=product_slug, slug=product_details)
    context = {'details': details}
    return render(request, 'shop/product_details.html', context=context)

标签: pythondjangodjango-modelsreverseslug

解决方案


改变你的路径。

path('category/<slug:brands_slug>/<slug:product_slug>/<slug:product_details>/', views.details_products, name='product_details'),

推荐阅读