ValueError:字段“id”需要一个数字但得到“游戏外设”

时间:2021-06-14 17:17:55

标签: django

我正在构建一个电子商务(类似)项目。在运行程序时,从主页,如果我们选择一个产品,我会遇到此错误,而不是显示该产品的详细信息。现在我不知道如何解决这个问题,请帮我解决。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})

1 个答案:

答案 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)