티스토리 뷰

  ● 게시물 상세보기  

 

post/views.py

- post_list.html 글목록 페이지에서 해당 글을 클릭하면 'post_detail' 경로에 post_id를 함께 전달한다.

- post_detail 에서는, get_object_or_404(모델, 키워드) Post 모델에서 post_id 가 존재하는 경우에는 객체를 가져오고 아니면 404 에러를 띄우도록 한다. 

 

- is_liked 는 좋아요 버튼이 눌려졌는지에 대한 변수로 디폴트 값은 False이다.

- 만약 사용자가 좋아요 버튼을 눌렀는지(filter) 확인하여(exists) 좋아요를 눌렀다면 is_liked = True로 설정하여 나중에 좋아요 버튼을 취소할 수 있도록 한다.

 

- 'post_detail.html' 템플릿과 함께 게시물 객체 post, 좋아요 눌러졌는지 is_liked, Post 클래스에서 정의한 좋아요 총 갯수 total_likes 값을 같이 렌더링한다.

def post_detail(request, post_id):
    post = get_object_or_404(Post, pk = post_id)
    is_liked = False

    if post.likes.filter(id = request.user.id).exists():
        is_liked = True
    
    return render(request, 'post_detail.html', context = {'post':post, 'is_liked':is_liked, 'total_likes':post.total_likes()})

 

 

 

 

django_blog/settings.py

- 게시글 소셜 공유 기능을 위해 패키지를 설치하고 INSTALLED_APPS 에 추가한다.

- 패키지 설치에는 '-' 표시를 사용하고 INSTALLED_APPS에 추가할 때에는 '_' 언더바 표시를 사용한다.

pip install django-social-share
INSTALLED_APPS += [
    'user',
    'post',
    'helpers',
    'taggit',
    'django_social_share',
]

 

 

 

 

templates/post_detail.html

- 소셜 공유 기능을 위해서 '{% load social_share %}' 을 extends 밑에 추가한다.

- 게시물 제목, 내용 그리고 이미지가 첨부되어 있다면 이미지까지 출력한다.

- 그 아래에 django 에서 제공하는 소셜 공유 모듈을 사용하여 페이스북 공유, 트위터 공유, 이메일 전송 기능을 추가한다.

{% extends 'base_.html' %}
{% load social_share %}
{% block content %}
    <div class = "container">
        <div class = "row">
            <div class = "col-lg-8 col-md-10 mx-auto">
                <h1>{{post.title}}</h1>
                <hr>
                {% if post.image %}
                    <img src = "{{ post.image.url }}" width = "400">
                {% endif %}
                <p>{{post.content}}</p>
            </div>
        </div>

        <div class = "row">
            <button type = button" class = "btn btn-light float-right">
                {% post_to_facebook post.get_absolute "facebook" %}
            </button>
            <button type ="button" class ="btn btn-light float-right">
                {% send_email post.title "New! {{post.title}} Check it out!" object_or_url "Share via email" %}
            </button>
            <button type ="button" class = "btn btn-light float-right">
                {% post_to_twitter '{{post.title}} 새로운 글!' post.get_absolute_url "Post to Twitter"%}
            </button>
        </div>
    </div>
{% endblock %}

 

 

 

 

"Not found /media/ " 오류 발생

- 하지만 실행결과, "Not found /media/ (이미지 파일)" 이라는 에러 메세지가 출력되면서 이미지 파일이 제대로 띄워지지 않는다.

- 이것은 게시글 객체 모델링할 때에 image 부분에 ImageField 에 관한 오류이다.

 

 

(1) 이미지 필드를 사용하기 위해서 pillow 패키지를 설치해야한다.

pip install pillow

 

(2) 업로드한 파일에 대한 저장 경로를 설정한 settings.py MEDIA_ROOT, MEDIA_URL은 작성자가 글을 작성하면서 media 폴더에 이미지가 추가되는 경로이다.

 

따라서, 다시 게시글을 볼 때에 어디서 불러오는지를 몰라서 오류가 발생한 것이므로 미디어 파일을 불러오는 경로를 지정해야한다.

메인 폴더 urls.py 파일에서 아래와 같이 + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) 를 추가하면 된다. 

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from user.views import register
from user.views import home 


urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/', register, name = 'register'),
    path('accounts/', include('django.contrib.auth.urls')),
    path('blogs/', include('post.urls')),
    path('', home),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

 

 

 

 

실행 결과

 

 

- 게시글 상세보기 페이지

 

 

 

- 트위터 공유 

 

- 페이스북 공유

- 이메일 전송

댓글