The Boxer

[Django] Model Form 본문

Django

[Django] Model Form

Prower 2019. 4. 10. 20:02
728x90
반응형

django에서 model을 사용해 form태그를 관리하고 적용

 

I. form

(1) forms

- django가 클래스로 form 태그를 생성

- 설정한 모델을 기반으로, django가 만들어 주는 form

- 클래스로 form태그를 제어한다

 

예시

if form.is_valid():
    form.save()
    return redirect('shouts:home')

 

form 클래스 생성(forms.py)

# form class
from django import forms
from .models import Shout

# Shout 모델에 기반하여 django가 만들어주는 form
class ShoutFrom(forms.Form):
    title = forms.CharField(max_length=10)
    content = forms.CharField(max_length=20)
  • html에서 사용시 form태그 안에서 사용
  • 속성을 model의 속성과 일치시켜주어야 함

 

클래스 생성 후 template 파일에 form클래스를 넘겨서 사용

form = ShoutForm()
    return render(reqeust, 'shouts/create.html', {'form':form})

 

1. form 클래스로 데이터 받고 저장하기

form = ShoutForm(request.POST)
if form.is_valid():
    form.save()
    return redirect('shouts:home')
  • form클래스를 생성하며 request객체를 넘겨서 사용
  • request.POST: input을 통해 넘어온 모든 값을 받음
  • request로 들어온 모든 데이터 form에 저장
  • form.save()로 DB에 데이터 저장

 

2. validation check 기능

- form데이터에 대해 유효성 검사

- 실제로 모든 필드에 대해 일일이 유효성 검사를 할 수 없다

- is_valid(): Model에서 데이터 필드를 생성할 때 걸었던 constraint에 대해 django가 유효성 검사를 실행

- cleaned_data: 유효성 검사를 통과한 정제된 데이터라는 의미. 기능상의 의미는 없음

if form.is_valid()
    title = form.cleand_data.get('title')

 

3. 기타 기능

- .as_p: p태그 처럼 출력

- .as_ul: 리스트 처럼 출력

- 둘 다 html에서 객체에 걸어서 사용

<form action="{% url 'shouts:create' %}" method="POST">
    {{ form.as_p }}
    {{ form.as_ul}}
    <input type="submit">
</form>

 

 

II. ModelForm class

- model에 있는 정보를 가져와 form태그로 지정

- model과 form을 연결한 class

- Meta클래스 안에서 정의

생성 예시

class ShoutModelForm(forms.ModelForm):
    class Meta:
        model = Stout
        fields = ['title', 'content']
        widgets = {
            'title': forms.TextInput(
                attrs = {
                    'class': 'form-control',
                    'placeholder': 'write title',
                },
            ),
            
            'content': forms.Textarea(
                attrs = {
                    'class': 'form-control',
                    'placeholder': 'write content',
                },
            ),
        }

 

1. model

- form클래스를 연결할 model 지정

 

2. fields

- 연결된 model의 fields를 지정

- model의 속성의 이름과 동일할 필요는 없음. 차례대로 연결

 

3. widget

- fields마다 태그 클래스의 특성 지정

- attrs: 태그의 속성, 클래스 정의

- form.TextInput(): text형태의 input 지정

- form.Textarea(): textarea형태의 input 지정

 

4. instance

- form태그에 객체를 넘겨서 templates파일로 전달

 

form 클래스 생성시에 넘겨줄 객체를 삽입

shout = Shout.objects.get(pk=1)
form = ShoutModelForm(instance=shout)
  • form.instance: form에 담긴 객체의 정보에 접근

 

객체 자체에 접근

login(request, form.instance)

 

html문서에서 접근 가능

"{% url 'shouts:home' form.instance.id %}"

 

728x90
반응형

'Django' 카테고리의 다른 글

[Django] 계정정보 수정, 비밀번호 변경  (0) 2019.04.18
[Django] M : N Relation 구현  (0) 2019.04.12
[Django] 계정 생성, 로그인, 로그아웃  (0) 2019.04.12
[Django] Image Upload  (0) 2019.04.11
Comments