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 을 사용하는 이유
cleaned_data
가 있어 검증된 데이터의 핸들링이 가능- request.POST['key'] 는 초기 인스턴스로 데이터가 바뀔 수가 있음
- cleaned_data['key'] 를 사용하는 것을 무조건 권장(장고 문서에서도 권장)
2개의 ModelForm 과 기본 Form 처리의 가장 큰 차이(ModelForm 기준)
- Meta 로 상속받아 모델과 필드를 그대로 사용
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 |