Django|Instagramクローンエンコーディング(9)-投稿の削除、変更、コメント


💇‍♀️ 投稿とコメントの削除、変更
前回はインスタ注目機能を実施しました.投稿を削除および変更する機能を実装します.同様に、この機能は、ログインレコーダを使用してログインしている特権ユーザーのみが使用できます.
🔎 投稿とコメントの削除、修正機能の分析
削除、変更できるのは、
  • 投稿とその作成者のみです.コメントも同じです
  • 投稿は削除および変更できますが、削除できるのは投稿のみで、変更できません.
  • 投稿を変更する場合は、投稿の内容(内容)のみ変更でき、画像(画像url)は変更できません.
  • 🛠 App
    投稿およびコメントを削除および変更する機能は、投稿に関連しています.postingアプリケーションで作成してください.
    🖌 モデルの作成
    # posting/models.py
    
    from django.db   import models
    from user.models import User
    
    class Posting(models.Model):
        content    = models.CharField(max_length=2000, null=True)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)   --> 추가
        user       = models.ForeignKey('user.User', on_delete=models.CASCADE)
    
        class Meta:
            db_table = 'postings'
    Postingクラスでは、投稿の作成時間を記録するためにcreated_atしか使用されず、変更時間を記録するためにupdated_atフィールドが追加されています.
    💣 ビューの作成
    投稿とコメントの削除
    投稿とコメントは同じ削除ロジックを持っているため、投稿に基づいて説明します.
    part1. PostingDetailViewの作成
    投稿を削除すると、通常、特定の投稿のidが受信され、削除されます.すべてを一度に削除することはありません.したがって、PostingDetailViewクラスを作成して詳細を管理できます.
    class PostingDetailView(View):
    part2. ログインしたユーザーと作成者が同じかどうかを確認します.
    通常、投稿を削除できるのは投稿のみです.したがって、ログイントークンを介して受信したユーザー情報(user)が、ロケーションの作成者(posting.user)と同じであることを確認してください.
    @login_decorator
    def delete(self, request, posting_id):
        user = request.user
    
        if not Posting.objects.filter(id=posting_id).exists():
            return JsonResponse({'message':'POSTING_DOES_NOT_EXIST'}, status=404)
    
        posting = Posting.objects.get(id=posting_id)
    
        if user != posting.user:
            return JsonResponse({'message':'INVALID_USER'}, status=401)
    投稿の変更
    part1. Post関数でのPost関数の使用
    修正には、PostingDetailViewによって記述された詳細も含まれる.
    修正するときはpatchputを使うことができますが、postを使います.
    class PostingDetailView(View):
    (...생략)
    
        @login_decorator
        def post(self, request, posting_id):
    part2. ログインしたユーザーと作成者が同じかどうかを確認します.
    削除機能と同様に、ログインしたユーザーと作成者が同じであることを確認してください.
    Part3. 投稿の変更
    ディックラウンジgetメソッドを使って修正機能を実現します.
    この方法の利点をトランスファで詳細に説明した.
    posting.content = data.get('content', posting.content)
    posting.save()
    👀 フルビューコード
    # posting/views.py
    
    (...생략)
    
    class PostingDetailView(View):
        @login_decorator
        def delete(self, request, posting_id):
            user = request.user
    
            if not Posting.objects.filter(id=posting_id).exists():
                return JsonResponse({'message':'POSTING_DOES_NOT_EXIST'}, status=404)
    
            posting = Posting.objects.get(id=posting_id)
    
            if user != posting.user:
                return JsonResponse({'message':'INVALID_USER'}, status=401)
    
            Posting.objects.filter(id=posting.id).delete()
            return JsonResponse({'message': 'SUCCESS'}, status=200)
    
        @login_decorator
        def post(self, request, posting_id):
            try:
                data = json.loads(request.body)
                user = request.user
    
                if not Posting.objects.filter(id=posting_id).exists():
                    return JsonResponse({'message': 'POSTING_DOES_NOT_EXIST'}, status=404)
    
                posting = Posting.objects.get(id=posting_id)
    
                if user != posting.user:
                    return JsonResponse({'message':'INVALID_USER'}, status=401)
    
                posting.content = data.get('content', posting.content)
                posting.save()
                return JsonResponse({'message': 'SUCCESS'}, status=201)
    
            except JSONDecodeError:
                return JsonResponse({'message':'JSON_DECODE_ERROR'}, status=400)
                
    (...생략)
    
    class CommentDetailView(View):
        @login_decorator
        def delete(self, request, comment_id):
            user = request.user
    
            if not Comment.objects.filter(id=comment_id).exists():
                return JsonResponse({'message':'COMMENT_DOES_NOT_EXIST'}, status=404)
    
            comment = Comment.objects.get(id=comment_id)
    
            if user != comment.user:
                return JsonResponse({'message':'INVALID_USER'}, status=401)
    
            Comment.objects.filter(id=comment.id).delete()
            return JsonResponse({'message': 'SUCCESS'}, status=200)
    📬 urlパスの指定
    # posting/urls.py
    
    from django.urls import path
    from .views import (
        PostingView,
        PostingSearchView,
        PostingDetailView,  --> 추가
        CommentView,
        CommentSearchView,
        CommentDetailView,  --> 추가
        LikeView, 
    )
    
    urlpatterns = [
        path('', PostingView.as_view()),
        path('/search/<int:user_id>', PostingSearchView.as_view()),
        path('/<int:posting_id>', PostingDetailView.as_view()),  --> 추가
        path('/comment', CommentView.as_view()),
        path('/comment/search/<int:posting_id>', CommentSearchView.as_view()),
        path('/comment/<int:comment_id>', CommentDetailView.as_view()),  --> 추가
        path('/like', LikeView.as_view()),
    ]