3차 프로젝트 | 25.02.07 (금) 기록

Faithful Dev·2025년 2월 7일
0

갤러리 댓글 시스템 구현

Comment 모델 수정

기존에 있던 Comment 모델에 필요한 필드들을 추가했다. 이때 기존 DB 데이터를 유지하기 위해 새로 추가되는 필드들은 null을 허용하도록 설정했다.
어제 DB를 날려먹은 뼈아픈 기억..

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments")
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True, null=True)
    updated_at = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return f"Comment by {self.author or 'Anonymous'} on {self.post}"

API 엔드포인트 구현

댓글의 목록 조회와 작성을 위한 API 엔드포인트를 구현했다.

# urls.py
urlpatterns = [
    path("posts/<int:post_id>/comments/", views.comment_list_create, name="comment_list_create"),
    path("comments/<int:pk>/", views.comment_detail, name="comment_detail"),
]

# views.py
@require_http_methods(["GET", "POST"])
def comment_list_create(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    
    if request.method == "GET":
        comments = Comment.objects.filter(post=post).select_related('author')
        data = [{
            'id': comment.id,
            'message': comment.message,
            'author': comment.author.username if comment.author else 'Anonymous',
            'created_at': comment.created_at.isoformat(),
        } for comment in comments]
        return JsonResponse({'comments': data})
    
    elif request.method == "POST":
        if not request.user.is_authenticated:
            return JsonResponse({'error': '로그인이 필요합니다.'}, status=401)
        
        try:
            data = json.loads(request.body)
            message = data.get('message', '').strip()
            
            if not message:
                return JsonResponse({'error': '댓글 내용을 입력해주세요.'}, status=400)
            
            comment = Comment.objects.create(
                post=post,
                author=request.user,
                message=message
            )
            
            return JsonResponse({
                'id': comment.id,
                'message': comment.message,
                'author': comment.author.username,
                'created_at': comment.created_at.isoformat(),
            }, status=201)
            
        except json.JSONDecodeError:
            return JsonResponse({'error': '잘못된 요청입니다.'}, status=400)

사용자 프로필 자동 생성 구현하기

이거 전에 올린 거 같은데? 라고 생각하신다면, 그것이 정답입니다.
어제 DB를 날려먹은 죄로,,,
사용자 프로필 수정 페이지 접근 시 다음과 같은 에러가 발생하는 것을 발견.

django.contrib.auth.models.User.profile.RelatedObjectDoesNotExist: User has no profile.

signals.py 수정

accounts/signals.py 파일을 수정하여 User 생성 시 자동으로 Profile이 생성되도록 구현,,, 하였다기보다는 주석처리 해놨던 부분을 원복.

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance, nickname=instance.username)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    try:
        instance.profile.save()
    except Profile.DoesNotExist:
        Profile.objects.create(user=instance, nickname=instance.username)

apps.py 확인

from django.apps import AppConfig

class AccountsConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "accounts"

    def ready(self):
        import accounts.signals

이거는 코드가 그대로 잘 남아 있어서 확인 정도만 하고 넘어감.

기존 사용자 프로필 생성

Django shell을 사용하여 기존 사용자들의 누락된 프로필을 생성하였다.

# Django shell 실행
python manage.py shell

# shell에서 실행한 코드
from django.contrib.auth.models import User
from accounts.models import Profile

for user in User.objects.all():
    Profile.objects.get_or_create(user=user, defaults={'nickname': user.username})

흙흙 정상 작동 감사합니다...

profile
Turning Vision into Reality.

0개의 댓글