티스토리 뷰

  ● 게시물 작성  

 

post/views.py

- 쇼핑몰 프로젝트에서는 직접 login_required를 만들어서 @mehod_decorator(login_required, name = 'dispatch')으로 접근 권한을 관리했다면, 이번에는 'django.contrib.auth.decorators' 장고 내장 모듈을 사용하여 @login_required으로 원하는 함수를 감싸서 해당 로직에 대한 접근을 관리한다.

 

- POST 요청일 경우( 글을 작성하고 "저장하기" 버튼을 누른 경우), 사용자가 작성한 정보 title, content, image 에 대한 값을 가져오고 Post 객체 생성한다.

- 게시물 객체를 생성하고, reverse 함수를 사용하여 현재 생성한 게시물의 상세페이지 주소를 만들고 redirect 를 사용하여 해당 주소로 이동한다.

 

- GET 요청인 경우( 버튼을 누르기 전), 그냥 post_wirte.html 을 렌더링하여 화면에 띄워준다.

@login_required
def post_write(request):
    errors = []
    if request.method == 'POST':
        title = request.POST.get('title', '').strip()
        content = request.POST.get('content', '').strip()
        image = request.FILES.get('image')
        if not title:
            errors.append('제목을 입력하세요.')
        if not content:
            errors.append('내용을 입력하세요.')
        if not errors:
            post = Post.objects.create(user=request.user, title = title, content = content, image = image)
            return redirect(reverse('post_detail', kwargs={'post_id': post.id}))
    return render(request, 'post_write.html', {'user':request.user, 'errors':errors})

 

 

 

templates/post_write.html

- 이전에 글 작성에 대해서 오류가 있었다면, 저장한 에러 메세지를 출력한다. 

- method 는 전송 방식(요청 방식), action 전송 목적지(어디로 form을 보낼건지), enctype 전송되는 데이터의 형식을 뜻한다. 

- 우리는 게시물 작성에 파일 및 사진 첨부가 함께 있으므로 서버에 데이터를 전송할 때 사용하는 방식인 'multipart/form-data' 으로 설정한다.

- textarea 는 일곱 줄만큼의 사이즈를 갖도록 rows = 7 으로 설정한다.

{% extends 'base_.html' %}
{% block content %}
<div class = "container">
    <div class = "row">
        {% if errors %}
        <ul>
            {% for error in errors %}
            <li><div class = "alert alert-primary" role = "alert">{{error}}</div></li>
            {% endfor %}
        </ul>
        {% endif %}
        <form method = "post" action = "{% url 'post_write' %}" enctype = "multipart/form-data" class = "col-lg-8 col-md-10 mx-auto">
            {% csrf_token %}
            <div class = "form-group row">
                <label for = "title">제목</label>
                <input type = "text" class = "form-control" name = "title" placeholder="제목을 입력해주세요.">
            </div>
            <div class = "form-group row">
                <label for = "content">내용</label>
                <textarea class = "form-control" name = "content" rows = "7"></textarea>
            </div>
            <div class = "form-group row">
                <label for = "content">사진 첨부</label>
                <input type = "file" class = "form-control" name = "image">
            </div>
            <div class = "form-group row float-right">
                <button type = "submit" class = "btn btn-primary">저장하기</button>
            </div>
        </form>
    </div>
</div>
{% endblock %}

 

 

 

 

django_blog/settings.py

- 게시물에 올리는 미디어 파일들을 관리하기 위해 media_root media_url을 설정해준다.

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

 

 

 

실행 결과

 

 

 

 

 

- 제대로 실행되는지 알기 위해, 작성해보고 admin 페이지를 확인한다.

 

 

- 위에서 작성한대로 관리자 페이지에서 Post 객체가 생성된 것을 확인할 수 있다.

 

 

 

 

- 또한 첨부한 이미지 파일이 media 폴더에 저장된 것을 알 수 있다.

 

댓글