Как сделать объект в Django Views? - PullRequest
2 голосов
/ 14 апреля 2019

У меня есть форма, которая принимает URL-адреса. Этот URL затем анализируется с помощью BS4, а продукт создается со следующим классом:

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()

Я хочу сохранить в базу данных только уникальные товары. Поэтому я добавил следующий код в функцию add в файле views.py , чтобы проверить продукт по его идентификатору:

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 Вероятно, есть лучший способ получить, сравнить и затем отобразить объект. Пожалуйста, дайте мне знать. Заранее спасибо!

1 Ответ

1 голос
/ 14 апреля 2019

Можете ли вы просто перенаправить на определенное для Продукта свойство 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...