从JavaScript传递尺寸参数到Django后端的问题

-1 投票
1 回答
42 浏览
提问于 2025-04-12 02:09

我在把“size”这个参数从我的JavaScript函数传到Django后台时遇到了一些问题。下面是我Django视图中的相关代码:

def get_product(request, slug):
    try:
        product = Product.objects.get(slug=slug)

        if request.GET.get('size'):
            size = request.GET.get('size')
            print(size)

        return render(request, "core/product_detail.html")

    except Exception as e:
        print(e)

这是我的JavaScript函数:

function get_correct_price(size) {
    console.log(size);
    window.location.href = window.location.pathname + `?size=${size}`;
}

在我的HTML模板中,我用size参数调用了这个JavaScript函数:

<button onclick="get_correct_price('{{ s.name }}')">{{ s.name }}</button>

但是,当我点击按钮时,size参数似乎没有传到后台。我确认了JavaScript函数确实被调用了,而且size参数在控制台中也正确打印出来了。

你能帮我找出为什么size参数没有在后台接收到吗?任何建议或见解都非常感谢!谢谢!

urls.py文件:

path("products/",product_list_view,name="product_list"),
path("product/<pid>/",product_detail_view,name="product_detail"),
path("product/<slug>/",get_product,name="product_detail"),

在我的models.py文件中:

class Size(models.Model):
    name=models.CharField(max_length=100)
    code= models.CharField(max_length=50,blank=True,null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)

    def __str__(self):
        return self.name
class Product(models.Model):
    pid=ShortUUIDField(length=10,max_length=100,prefix="prd",alphabet="abcdef")


    user=models.ForeignKey(CustomUser, on_delete=models.SET_NULL ,null=True)
    cagtegory=models.ForeignKey(Category, on_delete=models.SET_NULL ,null=True,related_name="category")
    vendor=models.ForeignKey(Vendor, on_delete=models.SET_NULL,null=True,related_name="product")
    color=models.ManyToManyField(Color,blank=True)
    size=models.ManyToManyField(Size,blank=True)


    title=models.CharField(max_length=100,default="Apple")
    image=models.ImageField(upload_to=user_directory_path,default="product.jpg")
    description=RichTextUploadingField(null=True, blank=True,default="This is a product")

    price = models.DecimalField(max_digits=10, decimal_places=2, default=1.99)
    old_price = models.DecimalField(max_digits=10, decimal_places=2, default=2.99)

    specifications=RichTextUploadingField(null=True, blank=True)


    tags=TaggableManager(blank=True)

    product_status=models.CharField(choices=STATUS, max_length=10,default="In_review")


    status=models.BooleanField(default=True)
    in_stock=models.BooleanField(default=True)
    featured=models.BooleanField(default=False)
    digital=models.BooleanField(default=False)

    sku=ShortUUIDField(length=10,max_length=100,prefix="sku",alphabet="abcdef")

    date=models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(null=True,blank=True)

    class Meta:
        verbose_name_plural="Products"

    def product_image(self):
        return mark_safe('<img src="%s" width="50" height="50"/>'%(self.image.url))

    def __str__(self):
        return self.title
    def get_percentage(self):
        new_price=((self.old_price-self.price)/self.old_price)*100
        return new_price

简单来说: 我只想要从这个网址 http://127.0.0.1:8000/product/prdeeffeafaec/?size=15inch 中打印出 15inch 这个值。

1 个回答

1
  1. 确保你的网址名称是独一无二的。

  2. 设置网址参数,格式如下。

path("products/",product_list_view,name="product_list"),
path("product/<int:pid>/",product_detail_view,name="product_detail"),
path("product/<slug:slug>/",get_product,name="get_product")

参考链接

制作一个错误页面模板,并在出现异常时显示这个页面。

def get_product(request, slug):
    try:
        product = Product.objects.get(slug=slug)

        if request.GET.get('size'):
            size = request.GET.get('size')
            print(size)

        return render(request, "core/product_detail.html")

    except Exception as e:
        print(e) 
        return render(request, "core/error_page.html")
  1. 显然,你的模型里没有叫做 slug 的字段。所以下面的代码是无法工作的。 而且 print(size) 也不会输出。这是因为下面的代码行没有执行,导致错误。
product = Product.objects.get(slug=slug)

你只能通过模型中的字段值来获取对象。 像下面这样。

product = Product.objects.get(title="product_title")

#or

product = Product.objects.get(id=4)

撰写回答