Update(수정)
- 수정을 하기 위해서는 해당 객체에 접근했을 때 저장되어 있는 DB 를 load 해야 한다.
- Form 을 이용해서 수정을 한다.
Product Model
class Product(models.Model):
description = models.CharField(max_length=100)
price = models.DecimalField(max_digits=9, decimal_places=2)
quantity = models.IntegerField()
def __str__(self):
return self.description
forms.py
class ProductUpdateForm(forms.ModelForm):
class Meta:
model = Product
fields = [
'description',
'price',
'quantity'
]
views.py 에서 핸들링
- instance 에 해당 객체를 맵핑시켜주지 않으면 저장된 정보들이 불러와지지 않는다.
- instance='객체' 를 지정하지 않아도 업데이트가 되기는 하지만 수정할 때 최초 빈 form 이 load 됨
def product_update(request, pk):
product = get_object_or_404(Product, pk=pk)
form = ProductUpdateForm(request.POST or None, instance=product)
if form.is_valid():
form.save()
return redirect('product:products')
context = {
'form': form,
}
return render(request, 'product/product-update.html', context)
템플릿
# product-detail.html 에서 디테일 페이지로 접근
<a href="{% url 'product:update' product.pk %}">수정하기</a>
# product-update.html
{% extends 'base.html' %}
{% block content %}
<form action="" method="POST">
{% csrf_token %}
{{ form }}
<button type="submit">수정하기</button>
</form>
{% endblock %}
결론
지금은 단순히 하나의 모델 객체에만 접근했기 때문에 쉽게 구현되지만 ForeignKey 와 같은 관계형 모델이 관여하게 되면 생각보다 복잡한 작업이 된다. 지금 내가 접근하고자 하는 객체
에 포커스를 두어 전체 흐름이 어떻게 돌아가는지도 잊지 말고 생각하자.
'장고 > MTV' 카테고리의 다른 글
장고 한줄 정리 (0) | 2019.05.15 |
---|---|
장고 CRUD 기능 구현(4) Delete (0) | 2019.05.07 |
장고 CRUD 기능 구현(2) Read (0) | 2019.05.07 |
장고 CRUD 기능 구현(1) Create (0) | 2019.05.07 |
Login 기능 구현하기 (0) | 2019.04.21 |