Form & Serializer
๐ก Form & Serializer
Serializer / ModelSerializer
โช ๋ฐ์ดํฐ ๋ณํ / ์ง๋ ฌํ ์ง์
โช Django์ Form/ModelForm๊ณผ ์ ์ฌ
Serializer๋ view ์๋ต์ ์์ฑํ๋ ๋ฐ์ ๋ฒ์ฉ์ ์ด๊ณ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ค๋ค.
ModelSerializer๋ Serializer ์์ฑ์ ์ํ Shortcut์ด๋ค.
๐ก Feature ๋น๊ต
Form / ModelForm
html ์ ๋ ฅ form์ ํตํ ์ ๋ ฅ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ
์ฃผ๋ก Create/Update์ ๋ํ ์ฒ๋ฆฌ์์ ํ์ฉ โ ์ฅ๊ณ admin์์ ํ์ฉ
CreateView/UpdateView CBV๋ฅผ ํตํ view์ฒ๋ฆฌ โ ๋จ์ผ view
Serializer / ModelSerializer
๋ฐ์ดํฐ ๋ณํ ๋ฐ ์ง๋ ฌํ ์ง์ (JSON ํฌ๋งท)
์ฃผ๋ก JSON ํฌ๋งท ์ ๋ ฅ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ
List/Create ๋ฐ ํน์ ๋ฆฌ์์ค์ ๋ํ Retrieve/Edit/Delete ๋ฑ ์์ ํ์ฉ
APIView๋ฅผ ํตํ View ์ฒ๋ฆฌ โ ๋จ์ผ view โ 1๊ฐ์ URL ์ฒ๋ฆฌ
ViewSet์ ํตํ View ์ฒ๋ฆฌ โ 2๊ฐ view โ 2๊ฐ์ URL ์ฒ๋ฆฌ
๐ก ์ฃผ๋ ํธ์ถ ์ฃผ์
Form
์ผ๋ฐ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ์์์ HTML Form Submit์ ํตํด์ POST ์์ฒญ์ ๋ฐ๊ฒ ๋๋ค.
ํน์ JavaScript์ ์ํ ๋น๋๊ธฐ ํธ์ถ๋ ๊ฐ๋ฅํ๋ค.
๋ฌผ๋ก https ํ๋กํ ์ฝ ์์ฒญ/์๋ต์ด๊ธฐ์ Android/ios ์ฑ์ ์ํ ์์ฒญ/์๋ต๋ ๊ฐ๋ฅํ๋ค.
Serializer
๋ค์ํ Client(์น)์ ๋ํ Data ์์ฃผ์ http(s) ์์ฒญ
๐ก Class ์ ์
Form/ModelForm
1
2
3
4
5
6
7
8
9
10
11
12
13
# form
from django import forms
class PostForm(forms.Form):
email = forms.EmailField()
content = forms.CharField(widget=forms.Textarea)
created_at = forms.DateField()
# ModelForm
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = '__all__'
Serializer/ModelSerializer
Form ์ชฝ์ HTML Form์ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ด๋ค.
๋ฐ๋ฉด์ Serializer์ ๊ฒฝ์ฐ์๋ api ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ง์ถฐ์ ธ์๊ธฐ ๋๋ฌธ์
Form์์ ์ฌ์ฉํ widget์ Serializer์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
from rest_framework import serializers
# Serializer
class PostSerializer(serializers.Serializer):
email = forms.EmailField()
content = forms.CharField(max_length=200)
created_at = forms.DateField()
# ModelSerializer
class PostModelSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
๐ก ์ ํจ์ฑ ๊ฒ์ฌ ์ํ ์์
Form
1
Serializer
1
๐ก clean VS validate
์๋์ ๋ ์ฝ๋์์ ValidationError๋ ์ด๋ฆ์ ๊ฐ์ง๋ง, ๋ค๋ฅธ ๋ก์ง์ ํ๋ค.
Form
1
2
3
4
5
6
7
8
9
10
from django import forms
class PostForm(forms.Form):
title = forms.CharField()
def clean_title(self):
value = self.cleaned_data.get('title','')
if 'django' not in value:
raise forms.ValidationError('์คํจ')
return value
Serializer
1
2
3
4
5
6
7
8
9
from rest_framework import ValidationError
class PostSerializer(serializers.Serializer):
title = serializer.CharField(max_length=100)
def validate_title(self,value):
if 'django' not in value:
raise ValidationError('์คํจ')
return value