본문으로 바로가기

장고 CRUD 기능 구현(1) Create

category 장고/MTV 2019. 5. 7. 14:58

Create(생성)

  • forms.ModelForm, forms.Form 을 이용한 Create 기능 구현

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

> Form 을 사용한 모델의 데이터 처리

  • Form 을 사용하는 이유

    1. cleaned_data 가 있어 검증된 데이터의 핸들링이 가능
      • request.POST['key'] 는 초기 인스턴스로 데이터가 바뀔 수가 있음
      • cleaned_data['key'] 를 사용하는 것을 무조건 권장(장고 문서에서도 권장)
  • 2개의 ModelForm 과 기본 Form 처리의 가장 큰 차이(ModelForm 기준)

    1. Meta 로 상속받아 모델과 필드를 그대로 사용
    2. ModelForm 에는 이미 save() 메서드가 내장되어 있어 따로 정의할 필요가 없음
#1 ModelForm 을 활용한 처리
class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = [
            'description',
            'price',
            'quantity'
        ]


#2 기본 Form 을 활용한 처리
class ProductForm(forms.Form):
    description = forms.CharField(max_length=100)
    price = forms.DecimalField(max_digits=9, decimal_places=2)
    quantity = forms.IntegerField()

    def save(self, commit=True):
        self.instance = Product(**self.cleaned_data)
        if commit:
            self.instance.save()
        return self.instance

> views.py 에서 핸들링

  • 지극히 기본적인 기능만 작동하도록 한 view 이다.
  • 참고로 이미지 파일 등을 받을 때는 form 에 request.FILES 를 같이 받는데, 인자 순서에 주의해야 한다.
    • request.POST, request.FILES
def product_create(request):
    form = ProductForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('product:products')
    context = {
        'form': form,
    }
    return render(request, 'product/product-create.html', context)

> 템플릿

  • forms.py 에서 정의한 Form 을 템플릿을 통해 render
# product-list.html
<a href="{% url 'product:create' %}">글 작성하기</a>


# product-create.html
{% extends 'base.html' %}

{% block content %}

    <form action="" method="POST">
        {% csrf_token %}
        {{ form }}
        <button type="submit">게시글 작성</button>
    </form>

{% endblock %}

> 결론

  • {{ form }} 은 model.py 가 아닌 forms.py 의 규격을 따른다.
  • 아래와 같이 정의할 경우 description 필드의 최대 입력값은 30을 가진다.
# models.py
description = models.CharField(max_length=40)

# forms.py
description = forms.CharField(max_length=30)

'장고 > MTV' 카테고리의 다른 글

장고 CRUD 기능 구현(3) Update  (0) 2019.05.07
장고 CRUD 기능 구현(2) Read  (0) 2019.05.07
Login 기능 구현하기  (0) 2019.04.21
User 모델에서 Username 을 Email 로 재정의  (0) 2019.04.18
try, except 와 if else 를 써야할 때  (0) 2019.03.14