Notice
Recent Posts
Recent Comments
Link
터칭 데이터
장고(Django) 투표(Votes) 기능 구현하기 2 - Serializers & Views 본문
Vote의 상세 페이지를 만들어 그 곳에서 로그인한 사용자가 투표를 하거나 자신이 한 투표들을 조회하고 이미 진행한 투표를 다른 곳에 행사하도록 수정하는 기능을 구현하겠습니다.
polls_api/serializers.py
from polls.models import Question,Choice, Vote
class VoteSerializer(serializers.ModelSerializer):
voter = serializers.ReadOnlyField(source='voter.username')
class Meta:
model = Vote
fields = ['id', 'question', 'choice', 'voter']
polls_api/views.py
from polls.models import Question, Choice, Vote
from .serializers import *
class VoteList(generics.ListCreateAPIView):
serializer_class = VoteSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self, *args, **kwargs):
return Vote.objects.filter(voter=self.request.user)
def perform_create(self, serializer):
serializer.save(voter=self.request.user)
class VoteDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Vote.objects.all()
serializer_class = VoteSerializer
permission_classes = [permissions.IsAuthenticated, IsVoter]
IsVoter가 생소하실 수 있는데 우리가 직접 만들 permissions 클래스 입니다.
polls_api/permissions.py
class IsVoter(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.voter == request.user
기존의 IsOwnerOrReadOnly는 사용자가 아니면 조회만 가능하도록 하는 기능입니다. 그런데 이번에 자기 자신의 투표결과를 조회할 수 있는 것은 로그인한 본인이어야 합니다. 다른 사람이 자신의 투표를 볼 수 없도록 해야합니다. 그래서 투표자 본인인지 permissions로 IsVoter 클래스를 만들었습니다.
polls_api/urls.py
from .views import *
urlpatterns = [
...
path('vote/', VoteList.as_view()),
path('vote/<int:pk>/', VoteDetail.as_view()),
]
뷰에서 새로 만든 기능들도 URL 패턴으로 추가합니다.
IsVoter를 제외하고는 그동안 우리가 배워온 과정들의 복습입니다.
브라우저에서 user1으로 로그인하고 Vote List로 들어가보니 user1으로서 그동안 행사한 투표 결과를 볼 수 있습니다.
detail/숫자id URL로 더 상세히 들어가면 자신이 행사한 투표 결과를 수정할 수도 있습니다.
'장고 (Django)' 카테고리의 다른 글
장고(Django) 투표(Votes) 기능 구현하기 1 - Models (0) | 2023.11.05 |
---|---|
장고(Django) RelatedField (0) | 2023.11.05 |
장고(Django) User 권한 관리 (0) | 2023.11.05 |
장고(Django) Serializer를 사용하여 User 생성하기 (0) | 2023.11.05 |
장고(Django) Form을 사용하여 User 생성하기 (0) | 2023.11.05 |