The Boxer
[Django] Model Form 본문
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 %}"
'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 |