ํฌ์ŠคํŠธ

Form & Serializer

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

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.