장고 차단 앱 만들기
사용자가 차단한 사용자의 콘텐츠 (글, 댓글 등)을 보지 않게 하거나 메시지와 같은 상호작용을 차단하는 기능을 가진 앱을 만들어보았다.
차단 기능 앱만 따로 만들기엔 여러 기능들을 포괄하지 못한다고 생각해 다소 부족하다고 판단했다. 그래서 기존에 있던 accounts 앱과 profiles 앱 중 어느 쪽에 앱을 추가할지 고민했었고 profiles 앱을 선택했다. accounts 앱은 일반적으로 사용자 인증과 계정 관리와 관련된 기능들을 다루고 있지만, profiles 앱은 주로 사용자 프로필을 관리한다. 특히, 사용자 간의 관계(팔로우, 친구 요청, 좋아요 등)처럼 사용자 간의 상호작용과 관련된 기능도 관리하고 있다.
차단 기능은 사용자 간의 상호작용을 조절하는 중요한 요소로, 어떤 사용자를 차단함으로써 해당 사용자와의 모든 상호작용을 제한할 수 있다. 이는 profiles 앱의 주요 기능과 잘 어울린다고 판단했다.
모델 설계
차단 정보를 저장할 모델 설계했다. profiles/models.py에 Block이라는 모델을 추가로 작성했다. 이 Block 모델은 사용자가 차단한 사용자 목록을 관리하는 역할한다.
from django.contrib.auth.models import User
from django.db import models
from project_foler.models import TimeMixin
class Block(TimeMixin, models.Model):
blocker = models.ForeignKey(User, related_name='blocking', on_delete=models.CASCADE) # 차단하는 사용자
blocked = models.ForeignKey(User, related_name='blocked', on_delete=models.CASCADE) # 차단된 사용자
class Meta:
unique_together = ('blocker', 'blocked') # 중복 차단 방지
def __str__(self):
return f"{self.blocker}가 {self.blocked}를 차단함"
동일한 사용자가 같은 사용자를 여러 번 차단하지 못하도록 unique_together를 활용했다.
차단 뷰 구현
사용자가 다른 사용자를 차단할 수 있는 뷰를 만들었다.
from django.shortcuts import redirect, get_object_or_404
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import Block
@login_required
def block_user(request, user_id):
blocked_user = get_object_or_404(User, id=user_id) # 차단할 사용자 검색
block, created = Block.objects.get_or_create(blocker=request.user, blocked=blocked_user)
if created:
messages.success(request, f"{blocked_user.username}를 성공적으로 차단했습니다.")
else:
messages.warning(request, f"{blocked_user.username}는 이미 차단된 사용자입니다.")
return redirect('profile', user_id=user_id) # 프로필 페이지로 리다이렉션
이미 차단된 사용자라면 경고 메시지를 띄우고, 처음 차단된 사용자라면 차단을 진행하도록 했다.