티스토리 뷰
[django 블로그] Post 게시물 상세보기 (views.py, post_detail.html, 소셜 공유(페이스북, 이메일, 트위터), django_social_share )
지휘리릭 2020. 2. 2. 16:26● 게시물 상세보기
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)
실행 결과
- 게시글 상세보기 페이지
- 트위터 공유
- 페이스북 공유
- 이메일 전송
'django project > 블로그' 카테고리의 다른 글
- Total
- Today
- Yesterday
- UITableViewController Not Working
- pythonanywhere배포
- django clean
- 테이블출력안됨
- pythonanywhere배포방법
- cleaned_data
- django 태그
- CellForRowAt Not Called
- iOS UITableView 출력안됨
- django 게시판
- django 개발일지
- 알파벳 카운팅
- ModelForm Form 차이
- 데이터베이스 추천
- 장고 태그달기
- 실시간 데이터베이스
- django pythoneverywhere
- iOS 검은 화면
- django 로그인접근
- 웹 배포
- iOS 데이터베이스
- CellForRowAt 호출안됨
- Realtime Database
- iOS 화면 안나옴
- 장고 게시판
- python 웹 배포
- django tag
- Firebase 데이터베이스 추천
- 까만 화면
- Django
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |