Создание новых объектов вместо обновления - Django
Я пытаюсь использовать Update в Django, но он не обновляется, а создается новый объект модели в базе данных. Например, если я пытаюсь изменить метку товара "Ноутбук" на "Смартфон", Django создает новый товар под названием "Смартфон" вместо обновления "Ноутбука".
Вот мой код Модель:
class Products(models.Model):
label = models.CharField(max_length=50)
description = models.CharField(max_length=250)
first_price = models.FloatField(null=True)
price = models.FloatField()
quantity = models.IntegerField(default=0)
image = models.ImageField(null=True, blank=True)
def __str__(self):
return self.label
@property
def imageURL(self):
try:
url = self.image.url
except:
url = ''
return url
Форма:
class ProductForm(ModelForm):
class Meta:
model = Products
fields = ['label', 'description', 'first_price', 'price', 'quantity', 'image']
Вид:
@login_required(login_url='login')
def editProduct(request, id):
product = Products.objects.get(id=id)
form = ProductForm(instance=product)
if request.method == 'POST':
form = ProductForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, 'Product was edited.')
return redirect('index')
context = {
'form': form
}
return render(request, 'store/edit-product.html', context)
Шаблон:
<h3>Edit Product</h3>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.label.label }}
{{ form.label }}
{{ form.description.label }}
{{ form.description }}
{{ form.first_price.label }}
{{ form.first_price }}
{{ form.price.label }}
{{ form.price }}
{{ form.quantity.label }}
{{ form.quantity }}
{{ form.image.label }}
{{ form.image }}
<input type="submit" name="Add product">
{{form.errors}}
</form>
Заранее спасибо.
Чтобы обновить объект, его нужно передать форме, поэтому:
product = Products.objects.get(id=id)
form = ProductForm(instance=product)
if request.method == 'POST':
form = ProductForm(request.POST, request.FILES, instance=product)
# ^^^ Add this
В противном случае без instance
форма будет работать так, как будто вы пытаетесь создать новый объект