본문으로 바로가기

장고 CRUD 기능 구현(3) Update

category 장고/MTV 2019. 5. 7. 21:15

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