Django - Dstagram part3-댓글 기능 구현하기
Web/Django

Django - Dstagram part3-댓글 기능 구현하기

뉴비뉴 2019. 7. 23.

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'

 

댓글

💲 추천 글