我正在构建一个电子商务(类似)项目。在运行程序时,从主页,如果我们选择一个产品,我会遇到此错误,而不是显示该产品的详细信息。现在我不知道如何解决这个问题,请帮我解决。enter image description here
这是我的 Models.py
class Category(models.Model):
name=models.CharField(max_length=250,unique=True)
slug=models.SlugField(max_length=250,unique=True)
desc=models.TextField(blank=True)
image=models.ImageField(upload_to='category',blank=True)
class Meta:
ordering=('name',)
verbose_name='category'
verbose_name_plural='categories'
# for menu linking (url)
def get_url(self):
return reverse("ecommerce_app:products_by_category",args=[self.slug])
def __str__(self):
return '{}'.format(self.name)
class Product(models.Model):
name=models.CharField(max_length=250,unique=True)
slug = models.SlugField(max_length=250, unique=True)
desc = models.TextField(blank=True)
image = models.ImageField(upload_to='product', blank=True)
category=models.ForeignKey(Category,on_delete=models.CASCADE)
price=models.DecimalField(max_digits=10,decimal_places=2)
stock=models.IntegerField()
available=models.BooleanField(default=True)
created=models.DateTimeField(auto_now=True)
updated=models.DateTimeField(auto_now=True)
class Meta:
ordering = ('name',)
verbose_name = 'product'
verbose_name_plural = 'products'
# for url
def get_url(self):
return reverse("ecommerce_app:ProdCatDetails",args=[self.category.slug,self.slug])
def __str__(self):
return '{}'.format(self.name)
她是我的 Urls.py
from django.urls import path
from . import views
app_name='ecommerce_app'
urlpatterns=[
path('',views.allProdCat,name='allProdCat'),
# for special urls for Category
path('<slug:c_slug>/',views.allProdCat,name='products_by_category'),
# for special urls for Product Details
path('<slug:c_slug>/<slug:product_slug>/',views.ProdCatDetails,name='ProdCatDetails'),
]
这是我的 Views.py
from django.http import HttpResponse
from .models import Category,Product
from django.shortcuts import render,get_object_or_404
# Create your views here.
def home(request):
return HttpResponse("Hello")
def allProdCat(request,c_slug=None):
c_page=None
products=None
if c_slug!=None:
c_page=get_object_or_404(Category,slug=c_slug)
products=Product.objects.all().filter(category=c_page,available=True)
else:
products=Product.objects.all().filter(available=True)
return render(request,'category.html',{'category':c_page,'products':products})
# For product details
def ProdCatDetails(request,c_slug,product_slug):
try:
product=Product.objects.get(category__product=c_slug,slug=product_slug)
except Exception as e:
raise e
return render(request,'product.htmal',{'product':product})
答案 0 :(得分:1)
如果你过滤:
product = Product.objects.get(category=c_slug, slug=product_slug)
您将过滤 product
ForeignKey
所指的字段。由于未指定,这是 主键,因此是 AutoField
。
您可以过滤:
# filter on the slug ↓
product = Product.objects.get(category__slug=c_slug, slug=product_slug)