Programming Language/Django

Django 07) Form

Sergemeow 2023. 4. 11. 15:12
  • HTML form, input 태그를 통해서 데이터를 입력 받음
  • 입력된 데이터가 필요한 데이터 형식에 맞는지 유효성 검증이 필요.
  • Django From은 그것에 할애되는 과중한 작업과 반복코드를 줄여줌
  1. 렌더링을 위한 데이터 준비 및 재구성
  2. 데이터에 대한 HTML forms 생성
  3. 클라이언트로부터 받은 데이터 수신 및 처리

개요

  • Form Class
  • Model Class를 선언하는 것과 유사
  • Model과 마찬가지로 상속을 통해 선언(forms 라이브러리의 Form 클래스를 상속 받음)

활용

  • 앱 폴더에 forms.py를 생성 후 ActicleForm Class 선언
from django import forms

class ArticleForm(forms.Form):
	title = forms.CharField(max_length=10)
	content = forms.CharField()
  • form에는 model field와 달리 TextField가 존재하지 않음
  • 모델의 TextField처럼 사용하려면 다른 방법을 사용해야함
  • view 업데이트
def create(request):
	if request.method == 'POST':
		title = request.POST.get('title')
		content = request.POST.get('content')
		article = Article(title=title, content=content)
		article.save()
		return redirect('articles:detail', article.pk)
	else:
		form = ArticleForm()
		context = {'form':form}
		return render(request, 'articles/create.html',context)
  • create 템플릿 업데이트
{%$ extends 'base.html' %}

{% block content %}
	<h1>Create</h1>
	<form action="{% url 'articles:create' %}" method="POST">
		{% csrf_token %}
		{{ form.as_p }}
		<input type="submit">
	</form>
	<hr>
	<a href="{% url 'articles:index' %}">List</a>
{% endblock content %}

Form rendering options

  • <label> & <input> 쌍에 대한 3가지 출력 옵션
  1. as_p(): 각 필드가 단락(<p>)으로 감싸져서 렌더링
  2. as_ul(): 각 필드가 목록 항목(<li>)으로 감싸져서 렌더링(ul태그는 직접 작성)
  3. as_table(): 각 필드가 테이블(<tr>)행으로 감싸져서 렌더링
  • Django의 2가지 THML input 요소 표현
  1. Form fields
  • 입력에 대한 유효성 검사 로직을 처리
  • 템플릿에서 직접 사용됨
  1. Widgets
  • 웹페이지의 HTML input 요소 렌더링을 담당
  • 단순히 input 요소의 보여지는 부분을 변경
  • Widgets은 반드시 form fields에 할당됨

ModelForm

  • 모델과 폼의 연관성이 크기에 Model을 기반으로 Form을 만들어줌
  • ModelForm Class
    • Model을 통해 Form Class를 만들 수 있는 helper class
    • ModelForm은 Form과 똑같은 방식으로 view 함수에서 사용

ModelForm 선언

  • forms 라이브러리에서 파생된 ModelForm 클래스를 상속받음
  • 정의한 ModelForm 클래스 안에 Meta 클래스를 선언
  • 어떤 모델을 기반으로 form을 작성할 것인지에 대한 정보를 Meta 클래스에 지정
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
	
	class Meta:
		model = Article
		fields = '__all__'
  • Meta Class
    • ModelForm의 정보를 작성하는 곳
    • ModelForm을 사용할 경우 참조할 모델이 있어야 하는데, Meta class의 model 속성이 이를 구성함
      • 참조하는 모델에 정의된 field 정보를 Form에 적용함
    • fields 속성에 ‘all’를 사용하여 모델의 모든 필드를 포함할 수 있음
    • 또는 exclude 속성을 사용하여 모델에서 포함하지 않을 필드를 지정할 수 있음
class ArticleForm(forms.ModelForm):
	
	class Meta:
		model = Article
		fields = '__all__'

class ArticleForm(forms.ModelForm):

	class Meta:
		model = Article
		exclude = ('title',)

ModelForm 구현

Create

Update


Form과 ModelForm

  • ModelForm과 Form은 우열관계가 아닌 역할이 다른 관계
  • Form
    • 사용자의 입력을 필요로 하며 직접 입력 데이터가 DB 저장에 사용되지 않거나 일부 데이터만 사용될 때
  • ModelForm
    • 사용자의 입력을 필요로 하며 입력을 받은 것을 그대로 DB 필드에 맞춰 저장할 때
    • 데이터의 유효성 검사가 끝나면 데이터를 각각 어떤 레코드에 맵핑해야할지 이미 알고 있기 때문에 곧바로 save() 호출이 가능

Widgets

'Programming Language > Django' 카테고리의 다른 글

Django 09)Authorization/Authentication_1  (0) 2023.04.12
Django 08)Static/Media  (0) 2023.04.11
Django 06) CRUD_2  (0) 2023.04.11
Django 05) CRUD_1  (0) 2023.04.11
Django 04) SQLite 기초  (0) 2023.04.11