# board/forms.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = [ 'title', 'author', 'content', 'password' ]
widgets = {
'password': forms.PasswordInput,
}
model
: Model classfields
: 사용자에게 입력받을 속성 이름이 담긴 리스트.
- password
의 경우 Form Field에서 추가적으로 필요한 정보가 있음widget
: 데이터가 HTML tag로 해석될 때 어떤 element로 해석되는지를 지정해 줌.
password
의 경우 <input type="password" ...>
옵션이 필요함password = forms.CharField(label='Password', max_length=20, widget=forms.PasswordInput)
이라 정의할 수도 있음
# board/views.py
from django.views.generic.edit import CreateView
from django.urls import reverse
from .models import Post
from .forms import PostForm
class PostCreateView(CreateView):
model = Post
form_class = PostForm
def get_success_url(self):
return reverse('post_detail', args=[self.object.pk])
template_name
: "<app_label>/<model_name>_form.html"
model
, fields
를 입력받아 ModelForm을 생성해줌PostForm
을 이미 정의했기 때문에 fields
대신 form_class
속성 사용form_valid()
), success_url
로 redirect
PostCreateView.success_url = "{pk}/"
로 해도 되지만, URL 유지보수를 위해 reverse()
사용
reverse()
는 URLconf가 불러와진 상태에서만 사용할 수 있어 PostCreateView.success_url
에 대입 불가
get_success_url()
을 overriding<!DOCTYPE html>
<!-- board/templates/board/post_form.html -->
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Write or Edit Post - Seminar5</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Write">
</form>
</body>
</html>