사용자가 입력한 데이터가 우리가 원하는 데이터 형식이 맞는지에 대한 유효성 검증을 도와주는 Django Form과 ModelForm에 대해 알아보자!
forsm.py
를 생성 후 ArticleForm Class 선언# articles/forms.py
from django import forms
class ArticleForm(forms.Form):
title = forms.CharField(max_length=10)
content = forms.CharField(widget=forms.Textarea)
from .forms import ArticleForm
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)
{% extends 'base.html' %}
{% block content %}
<h1>글작성</h1>
<hr>
<form action="{% url 'articles:create' %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
{% endblock content %}
<label>
& <input>
쌍에 대한 3가지 출력 옵션as_p()
<p> 태그
)으로 감싸져서 렌더링as_ul()
<ul> 태그
)으로 감싸져서 렌더링<ul> 태그
는 직접 작성해야 함as_table()
<tr> 태그
)행으로 감싸져서 렌더링forms.CharField()
forms.CharField(widget=forms.Textarea)
Article Model Class에 필드에 대한 정보를 작성하고 이를 Form에 맵핑하기 위해서는 Form Class에 필드를 재정의해야 하고 Model과 중복 되는 부분이 많아 번거롭다.
이러한 Form을 더 쉽게 작성할 수 있게 해주는 ModelForm에 대해 알아보자.
# articles/forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
fields 속성에 ‘__all__’
를 사용하면 모델의 모든 필드를 포함할 수 있음
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
exclude 속성을 사용하면 모델에서 포함하지 않을 필드를 지정할 수 있음
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
exclude = ('title',)
is_valid()
is_valid()
를 제공하여 개발자의 편의를 도움save()
instance
여부를 통해 생성할지, 수정할지 결정CREATE
)UPDATE
)# CREATE
form = ArticleForm(request.POST)
article = form.save()
# UPDATE
form = ArticleForm(request.POST, instance=article)
form.save()
def create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save()
return redirect('articles:detail', article.pk)
return redirect('articles:create')
else:
form = ArticleForm()
context = {'form':form }
return render(request, 'articles/create.html', context)
def create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save()
return redirect('articles:detail', article.pk)
else:
form = ArticleForm()
context = {'form':form }
return render(request, 'articles/create.html', context)
request.POST
: 사용자가 form을 통해 전송한 데이터(새로운 데이터)instance
: 수정이 되는 대상def update(request, pk):
article = Article.objects.get(pk=pk)
if request.method == 'POST':
form = ArticleForm(request.POST, instance=article)
if form.is_valid():
form.save()
return redirect('articles:detail', pk=article.pk)
else:
form = ArticleForm(instance=article)
context = {'form': form,
'article':article }
return render(request, 'articles/update.html', context)
{% extends 'base.html' %}
{% block content %}
<h1>글수정</h1>
<hr>
<form action="{% url 'articles:update' article.pk %}" method="POST">
{% csrf_token %}
{{form.as_p}}
<input type="submit">
</form>
<hr>
<a href="{% url 'articles:detail' article.pk %}">돌아가기</a>
{% endblock content %}
꿈나무님, DRF 내용도 올리실 예정인가요 ? 올라온다면 언제쯤 올리실 예정이실까요 ?