# 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>