首页 > 解决方案 > 如何在 Django 视图中渲染对象?

问题描述

我有一个接受 URL 的表单。然后使用 BS4 解析此 URL,并使用以下类创建产品:

class Product(models.Model):
    product_id = models.CharField(max_length=50)
    pub_date = models.DateTimeField(default=datetime.now)
    title = models.CharField(max_length=255)
    url = models.TextField()
    price = models.FloatField()

我只想将独特的产品保存到数据库中。因此,我将以下代码添加到views.py文件中的add函数中,以通过产品 ID 来检查产品:

def add(request):
    ...
    product.product_id = soup.find('h1', class_='product-id').text
    if Product.objects.filter(product_id=product.product_id):
        return render(request, 'product/add.html', {'error': 'Product already exists'})
    else:
        product.title = soup.find('h1', class_='product-name').text
        ...
        product.save()
        return redirect('/product/' + str(product.id))

目前,用户收到“产品已存在”错误消息。但我想实际渲染已经存在的产品。这是详细产品的功能:

def detail(request, product_id):
    product = get_object_or_404(Product, pk=product_id)
    return render(request, 'product/detail.html', {'product': product})

详细产品的 URL 如下所示:http ://example.com/product/22 可能有更好的方法来检索、比较然后呈现对象。请告诉我。提前致谢!

标签: pythondjangopostgresqldjango-modelsbeautifulsoup

解决方案


您可以直接重定向到产品定义的 get_absolute_url 属性吗?

def add(request):
    ...
    product.product_id = soup.find('h1', class_='product-id').text
    existing_product = Product.objects.filter(product_id=product.product_id)
    if existing_product:
        return redirect(existing_product.get_absolute_url())

推荐阅读