DISQUS 가입하기
댓글 시스템을 직접 만들지 않고 DISQUS라는 온라인 소셜 댓글 시스템을 빌려서 사용할 것이다.
이 시스템을 사용하려면 사이트에 가입해야 한다. 사이트(https://disqus.com/)
DISQUS 앱 설치
$ pip install django-disqus
config/settings.py
[
'disqus',
'django.contrib.sites',
]
두 개를 추가한다.
- sites는 장고에서 사용하는 사이트 관리 프레임워크이다. 멀티사이트 구성이나 개별 사이트의 도메인 관리 등 담당
- disqus 앱을 사용하기 위해 disqus 추가
$ python manage.py migrate
sites 앱을 위한 데이터베이스를 설정한다.
이제 disqus 사용을 위한 설정값을 settings.py 에 추가해준다.
DISQUS_WEBSITE_SHORTNAME = 'dstagram-django'
SITE_ID = 1
첫 번째 변수는 disqus에 설정해둔 이름을 써야한다.(dstagram-django)
두 번째 변수는 sites 앱에 등록된 현재 사이트 번호이다. 기본적으로 1번이기 때문에 1로 설정한다.
설정은 끝났다, 댓글 시스템이 출력되도록 수정만 하면 된다.
photo/templates/photo/detail.html
<div class="col-md-8 panel panel-default">
{% load disqus_tags %}
{% disqus_show_comments %}
</div>
load disqus_tags는 disqus 앱의 커스텀 태그들을 사용하겠다라는 의미입니다. 아랫줄에서 그 커스텀 태그 중에 하나인 disqus_show_comments 라는 태그를 사용해 댓글 시스템을 출력하도록 했습니다.
권한 제한하기
댓글도 사용할 수 있게 됐으니 인스타그램처럼 로그인한 사용자만 이 서비스를 사용할 수 있또록 변경해봅시다.
photo 앱의 views.py 파일을 수정하겠습니다. 권한 제한을 하는 방법은 다양하게 있지만 가장 쉽게하는 방법은 두가지.
데코레이터(decorator)와 미스인(mixin)을 사용하는 방법이다.
photo/views.py
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
class PhotoUploadView(LoginRequiredMixin,CreateView): # CreateView 를 PhotoUploadView가 상속받는다.
@login_required()
def photo_list(request):
class PhotoDeleteView(LoginRequiredMixin,DeleteView): # 제네릭 뷰 DeleteView를 사용하기 위해 상속 받는다.
class PhotoUpdateView(LoginRequiredMixin,UpdateView): # 제네릭 뷰 UpdateView를 사용하기 위해 상속 받는다.
데코레이터는 함수 형 뷰에서 사용하고 믹스인은 클래스 형 뷰에서 사용한다.
데코레이터는 뷰의 바로 윗줄에 써주고 믹스인은 첫 번째로 상속하도록 합니다. 이렇게 뷰를 수정한 뒤에 로그아웃하고 메인 페이지에 접속하면 바로 로그인 화면으로 이동하는 것을 확인할 수 있다.
[문제]
Detail 뷰는 views.py에 없기 때문에 상속을 할 수가 없어 권한 제한을 추가하지 못했습니다. 여러분이 직접 views.py에 PhotoDetailView를 구현하고 권한 제한도 추가해보세요.
from django.shortcuts import render
from django.views.generic.edit import CreateView, DeleteView, UpdateView, BaseDetailView
from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Photo
class PhotoUploadView(LoginRequiredMixin,CreateView): # CreateView 를 PhotoUploadView가 상속받는다.
model = Photo
fields = ['photo','text']
template_name = 'photo/upload.html' # 클래스 변수 생성, 이 변수는 실제 사용할 템플릿을 설정한다.
def form_valid(self, form): # 업로드를 끝내고 이동할 페이지를 호출하기 위해 사용하는 메서드
# 이 메서드를 오버라이드해서 작성자를 설정하는 기능을 추가했다.
form.instance.author_id = self.request.user.id # 작성자는 현재 로그인한 사용자로 설정한다.
if form.is_valid(): # is_vaild() 입력 된 값들을 검증한다.
form.instance.save() # 이상이 없다면 데이터베이스에 저장하고
return redirect('/') # redirect 메서드를 이용해 메인 페이지로 이동한다.
else:
return self.render_to_response({'form':form}) # 문제가 있다면 내용을 그대로 작성 페이지에 표시한다.
@login_required()
def photo_list(request):
photos = Photo.objects.all() # 데이터베이스에 저장 된 모든 사진을 불러온다.
return render(request,'photo/list.html', {'photos':photos})
# 템플릿과 뷰를 연동하기 위해서 render 함수를 사용한다.
# render 함수는 첫 번째 인자로 request
# 두 번째 인자는 랜더링 할 템플릿
# 세 번째 인자는 템플릿에 보내줄 객체나 값
class PhotoDeleteView(LoginRequiredMixin,DeleteView): # 제네릭 뷰 DeleteView를 사용하기 위해 상속 받는다.
model = Photo
success_url = '/' # 성공 시 사이트 메인으로 이동한다.
template_name = 'photo/delete.html'
class PhotoUpdateView(LoginRequiredMixin,UpdateView): # 제네릭 뷰 UpdateView를 사용하기 위해 상속 받는다.
model = Photo
fields = ['photo','text']
template_name = 'photo/update.html'
class PhotoDetailView(LoginRequiredMixin,BaseDetailView):
model = Photo
fields = ['photo','text']
template_name = 'photo/detail.html'
'Web > Django' 카테고리의 다른 글
Django - Dstagram part5-배포하기 헤로쿠(Heroku) (0) | 2019.07.23 |
---|---|
Django - Dstagram part4-아마존 S3 연동하기(이미지 서버) (0) | 2019.07.23 |
Django - Dstagram part2-Account app (0) | 2019.07.18 |
Django - Dstagram part1-Photo app (0) | 2019.07.18 |
Django / 복습(book) (0) | 2019.07.05 |
댓글