Django/DRF

[Project] Django Form (์žฅ๊ณ  ํผ)

Jong_seoung 2023. 1. 2. 22:21
๋ฐ˜์‘ํ˜•

[Project] Django Form (์žฅ๊ณ  ํผ)

 

๐Ÿ“– ๊ฐœ์š”

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ createsuperuser๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๊ณ  ๊ทธ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์น˜๋Š” ์ค‘์— django form์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋˜์–ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

 

๐Ÿ“š Form ์˜ ๊ธฐ๋Šฅ

  •  Form ํƒœ๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ

 

 

๐Ÿ“š  ModelForm : Model์„ ์ด์šฉํ•œ Form ์ƒ์„ฑ

# forms.py

class ProjectCreationForm(forms.ModelForm):		# forms.ModelForm ์ƒ์†๋ฐ›์Œ
    # ํ•„๋“œ ์ถ”๊ฐ€ (์ง์ ‘ ํ•„๋“œ๋ฅผ ์ •์˜ํ•ด๋„ ๋จ)
    
    def __init__(self, *args, **kwargs):
        #์ƒ๋žต
    
    class Meta:
        model = Notice			# ๋ชจ๋ธ ์—ฐ๊ฒฐ
        fields = (			# ์†์„ฑ๋‚˜์—ด
            'name', 'title', 'content',
        )
        widgets = {			# default๊ฐ’ ๋ณ€๊ฒฝ์‹œ
            'title' : forms.TextInput(attrs={'class': 'form-control'}),
            'content' : forms.Textarea(attrs={'class': 'form-control', 'rows': 10}),
        }
        label = {
            'name' : '์ด๋ฆ„',
            'title' : '์ œ๋ชฉ',
            'content' : '๋‚ด์šฉ',  
        }
 
     def save(self, commit=True):			# save() ์˜ค๋ฒ„๋ผ์ด๋”ฉ
        user = super().save(commit=False)
        if commit:
            user.save()
        return user

    
    def clean(self):						# clean() ์˜ค๋ฒ„๋ผ์ด๋”ฉ
        cleaned_data = super().clean()
        title = cleaned_data.get('title')
        
        if '[๊ณต์ง€]' in title:				# ValidationError - ์•Œ๋ฆผ ์ฐฝ ๊ธฐ๋Šฅ
            raise ValidationError('ํ•ด๋‹น ๋ฌธ๊ตฌ๋Š” ์‚ฌ์šฉํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.')
        
        return cleaned_data
        
    
    
    # ์œ„์˜ clean()์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ
    def clean_title(self):
        title = self.cleaned_data.get('title')
        
        if '[๊ณต์ง€]' in title:				# ValidationError ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
             raise ValidationError('ํ•ด๋‹น ๋ฌธ๊ตฌ๋Š” ์‚ฌ์šฉํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.')
    
        return title

→ ํผ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” forms.ModelForm์„ ์ƒ์†๋ฐ›์•„์•ผ ํ•จ

→ ModelForm์€ ๋‚ด๋ถ€ํด๋ž˜์Šค์ธ Meta๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š” ํ•จ

 

  • class Meta
    • Meta ํด๋ž˜์Šค ์•ˆ์— model๊ณผ fielfs๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋ธ ํผ์ด ์ž๋™์œผ๋กœ ํผ ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•จ.
      • model : ๋ชจ๋ธ ํด๋ž˜์Šค ์—ฐ๊ฒฐ
      • fields : ํผ์— ์‚ฌ์šฉํ•  ์†์„ฑ ๋‚˜์—ด
      • label : ๋ณ€์ˆ˜๋ช… ๋Œ€์‹  ์ถœ๋ ฅ์‹œํ‚ฌ ๊ฐ’
  • forms.ModelForm ๋ฉ”์„œ๋“œ
    •  save() : ์ €์žฅ 
    •  clean() : ์œ ํšจ์„ฑ๊ฒ€์‚ฌ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Œ
      • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ›์€ ์•„์ด๋”” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š”์ง€ ํ™•์ธ
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ผ์น˜์—ฌ๋ถ€ ํ™•์ธ
    •  clean_ํ•„๋“œ๋ช… : ํ•ด๋‹น ํ•„๋“œ๋งŒ ์œ ํšจ์„ฑ๊ฒ€์‚ฌ
      • error ์—ฌ๋ถ€์— ๋”ฐ๋ผ is_vaild()์˜ ๋ฆฌํ„ด๊ฐ’์ด True or False๋กœ ๊ฒฐ์ •๋œ๋‹ค.

 

 

๐Ÿ“š  Form ํ•„๋“œ ์ •์˜

๋ชจ๋ธํผ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ •์˜ํ•จ

 

Form ํ•„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ (Model ํ•„๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์œ ์‚ฌ)

  •  max_length : ์ตœ๋Œ€๊ธ€์ž์ˆ˜
  •  required : ํ•„์ˆ˜๊ฐ’
  •  label : name, title, content์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๋ช… ๋Œ€์‹ ์— ์ถœ๋ ฅ์‹œํ‚ฌ ๊ฐ’ - ๊ฐ€๋ช… ๊ฐœ๋… 
  •  initial : ํผ์—์„œ ์ž…๋ ฅ์‹œํ‚ฌ ์ดˆ๊ธฐ๊ฐ’ - defu
  •  validators : ์œ ํšจ์„ฑ๊ฒ€์‚ฌ (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” Model์—์„œ ํ•˜๋Š” ๊ฑธ ์ถ”์ฒœ)

 

def __init__(self, *args, **kwargs) : ์ƒ์„ฑ์ž

  •  widget.attrs.update() : ์œ„์ ฏ ์†์„ฑ๊ฐ’ ๋ณ€๊ฒฝ

 

forms.Form ๋ฉ”์„œ๋“œ

  •  clean() : ์œ ํšจ์„ฑ๊ฒ€์‚ฌ

 

๐Ÿ“Œ View -> Form ๋ฐ์ดํ„ฐ ๋„˜๊ธฐ๊ธฐ

 Form์˜ ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๋ฉด ๋จ

 

views.py

form = UserCreationForm(user = request.user)			# GET๋ฐฉ์‹
form = UserCreationForm(request.POST, user = request.user) 	# POST๋ฐฉ์‹

 

 

forms.py

class UserCreationForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')		# pop์„ ์ด์šฉํ•˜์—ฌ ๋ฐ›์Œ	
        super().__init__(*args, **kwargs)

 

 

๋ฐ˜์‘ํ˜•