forms.py
- 지금까지 관리자 페이지에서 모델이 제대로 생성되었는지 확인하였고, 블로그 객체를 하나 만들었습니다.
- 이제 이것을 블로그 메인 화면에서 [글쓰기] 버튼을 누르면 창이 뜨도록 만들어봅시다.
- 전에 만든 데이터베이스 모델에서 항목들('title', 'pub_date', 'body')을 가져오는 작업을 해야 합니다.
그렇게 하기 위해서 [forms.py] 파일을 생성해줍니다.
[blogapp]에서 오른쪽 클릭을 합니다. [blogapp]-[New]-[Python File]
[forms]라고 입력하고 [OK]를 클릭합니다.
- [forms.py]가 생성되었습니다.
- 일단 다음과 같이 입력합니다.
from django import forms from .models import Blog class CreateBlog(forms.ModelForm): class Meta: model = Blog fields = ['title', 'pub_date', 'body']
- 장고에서 기본적으로 지원하는 [forms]를 import합니다.
또한 Blog 모델을 가져옵니다. - 블로그를 생성할 것이기 때문에 이름을 [CreateBlog]로 하였습니다.
장고에서 Meta 클래스는 내부 클래스로 활용되며, 이는 기본 필드의 값을 재정의할 때 사용합니다.
[Blog]로 부터 모델을 가져오고 그 중 'title', 'pub_date', 'body'를 가져온다는 의미입니다.
createBlog.html
- [글쓰기]에 사용할 폼은 만들었지만, 그것을 띄워줄 템플릿을 아직 생성하지 않았습니다.
- 지금까지 하던 대로 view를 만들고 템플릿[createBlog.html]을 생성하겠습니다.
자세한 설명은 생략하도록 하겠습니다.
[blogapp]-[templates]에서 오른쪽 클릭합니다. [blogapp]-[templates]-[New]-[HTML File]
[createBlog]입력하고 [OK]누릅니다.
[createBlog.html]이 생성되었습니다.
- [blogapp]-[views.py]에서 뷰를 생성해주도록 합니다.
- 함수 이름은 [createBlog]로 만들었습니다.
def createBlog(request): return render(request, 'createBlog.html')
- [firstProject]-[urls.py]에서 url을 추가해주도록 합니다.
- 저는 [blogMain/createBlog]주소가 입력되면 연결되도록 해주었습니다.
path('blogMain/createBlog/', blogapp.views.createBlog, name='createBlog'),
- [blogMain.html]에서 [글쓰기] url 연결해줍니다.
뷰 수정
- 이제 [글쓰기] 페이지로 링크 연결까지 해주었으니 [createBlog] 함수에서 폼을 불러들이도록 합시다.
- [blogapp]-[views.py]에서 [createBlog] 함수를 다음과 같이 수정합니다.
- 불러들인 폼을 [createBlog.html]으로 보내기 위해 [form]이라는 객체를 생성하고 보내줍니다.
지금까지는 render(request, '템플릿') 형식으로 사용하였지만, 여기서는 세번째 인자가 하나 더 추가된 것을 볼 수 있습니다.
세번째 인자는 [context]를 보내는 것이며, 딕셔너리 자료형의 형태를 가집니다. 이는 [createBlog.html] 문서에 딕셔너리 자료형을 보내게 되고, [createBlog.html]에서는 장고 템플릿 변수를 이용하여 값을 출력할 수 있게 됩니다.
from .forms import CreateBlog def createBlog(request): form = CreateBlog() return render(request, 'createBlog.html', {'form': form})
createBlog.html 수정
- 위에서 딕셔너리 자료형으로 [form]이라는 객체를 전달하였으므로 키 값 'form'을 이용하여 출력해봅시다.
- html 문서에서 출력할 때에는 장고 템플릿 변수를 이용하여 출력합니다.
- 형태는 {{ }} 와 같은 형식을 이용합니다.
- 객체를 가져오기 때문에 상황에 따라 장고 템플릿을 활용하여 사용할 수 있습니다.
- 우리는 일단 그냥 값을 출력해보도록 합시다.
{{ form }}
- 서버를 실행하고 [글쓰기]에 들어가면 다음과 같이 뜰 것입니다.
- 'title', 'pub_date', 'body'가 출력이 되는 것을 볼 수 있습니다.
- [createBlog.html]에서 다음과 같이 수정해보도록 하겠습니다.
{{ form.as_p }}
- 이는 폼을 <p> 태그로 감싼 형태로 출력해줍니다. 이 외에도 'as_table', 'as_ul'이 있고, 각자 한번씩 테스트해보도록 합시다.
- [form.as_p]를 적용했을 때의 결과는 다음과 같습니다.