[Python Django] 3-1. CBV FormView를 이용한 Create 구현

2022. 3. 26. 09:37Python/Django Framework

반응형

FormView를 이용하여 게시판 글 작성 페이지를 만들어보겠습니다.

forms 생성

# board/forms.py

from django import forms


class BoardCreateForm(forms.Form):
    title = forms.CharField(
        max_length=256,
        label="제목",
        error_messages={'required': '제목을 입력해주세요'}
    )
    contents = forms.CharField(
        widget=forms.Textarea,
        label="내용",
        error_messages={'required': '내용을 입력해주세요'}
    )

views 수정

저장 후 다시 저장 페이지를 보여줍니다.

# board/views.py

from django.views.generic import FormView

from board.forms import BoardCreateForm
from board.models import Board


class BoardCreateView(FormView):
    form_class = BoardCreateForm
    template_name = "board_create.html"
    success_url = "/board/create/"

    def form_valid(self, form):
        # user 정보 취득
        user_id = self.request.session.get('user_id')
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return redirect("/user/login/")
        else:
            return redirect("/user/logout/")

        board = Board(
            title=form.cleaned_data.get('title'),
            contents=form.cleaned_data.get('contents'),
            insert_user=user
        )
        board.save()
        return super().form_valid(form)

템플릿 생성

# board/templates/board_create.html

{% extends "base.html" %}
{% block contents %}
    <div class="row mt-5">
        <div class="col-12 text-center">
            <h1>글쓰기</h1>
        </div>
    </div>
    <div class="row mt-5">
        <div class="col-12">
            <form action="." method="POST">
                {% csrf_token %}
                {% for field in form %}
                    <div class="mb-3">
                        <label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                        {% ifequal field.name 'contents' %}
                            <textarea class="form-control" id="{{ field.id_for_label }}"
                                      name="{{ field.name }}"></textarea>
                        {% else %}
                            <input class="form-control" id="{{ field.id_for_label }}" name="{{ field.name }}"
                                   type="{{ field.field.widget.input_type }}"/>
                        {% endifequal %}
                    </div>
                    {% if field.errors %}
                        <span style="color:red">{{ field.errors }}</span>
                    {% endif %}
                {% endfor %}
                <div class="d-grid mt-3">
                    <button class="btn btn-lg btn-primary" type="submit">저장하기</button>
                </div>
            </form>
        </div>
    </div>
{% endblock %}

url 연결

# board/urls.py

from django.urls import path

from board.views import BoardCreateView

urlpatterns = [
    path('create/', BoardCreateView.as_view())
]
반응형