[Django] Westagram(3) - 게시물 등록 기능 구현

그냥·2022년 6월 20일
0

django

목록 보기
11/20

1.startapp

Westagram에 새로운 기능을 구현하는 것이므로 새로운 app인 postings를 만든다.

python manage.py startapp postings


2. Modeling

게시물에 등록에 필요한 ERD를 설계한다. 게시물 등록을 위해서는 사용자, 생성 시간, 이미지 url, 게시물 제목, 게시물 내용 등이 필요하다.

from django.db import models

from users.models import User

class Posting(models.Model):
    user         = models.ForeignKey(User, on_delete=models.CASCADE, related_name="postings")
    created_at   = models.DateTimeField(auto_now_add=True)
    image_url    = models.URLField()
    postname     = models.CharField(default='', max_length=50)
    contents     = models.TextField(default='')

    class Meta:
        db_table = "postings"
  • user: 한 명의 user가 여러 개의 게시물을 등록할 수 있으므로 1:N 관계이다. 그러므로 User 테이블을 참조할 수 있도록 ForeignKey를 사용한다.
  • created_at: Posting.objects.create를 통해서 객체가 만들어질 때 언제 만들어졌는지가 저장된다. auto_now_add=True 옵션을 통해서 최초 생성 일시가 저장된다.
  • image_url: URLField는 URL를 위한 CharField로 URL validator를 통해서 유효성 검사를 할 수도 있다.
  • postname: 게시물 이름을 작성하기 위한 Field로 CharField를 선언한다.
  • contents: 길이의 제한이 없는 문자열을 사용하기 위해 TextField를 사용한다.


3. View

전제

  • Posting을 하기 위해서는 유저가 로그인이 된 상태여야 한다.
  • 게시물을 등록할 때에는 POST를 사용한다.
  • 게시물 등록시 image는 url 정보만 등록한다.
  • 게시물 생성 시간은 등록하는 현재 시간이어야 한다.
class PostingView(View):
    @login_decorator
    def post(self, request):
        try:
            data      = json.loads(request.body)
            user      = request.user
            image_url = data["image_url"] #data.get('imgae_url', None)
            postname  = data["postname"]
            contents  = data["contents"]

            Posting.objects.create(
                user       = user,
                image_url  = image_url,
                postname   = postname,
                contents   = contents
            )

            return JsonResponse({"MESSAGE" : "SUCCESS"}, status=201)
        except KeyError:
            return JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status = 400)

1) @login_decorator
로그인을 한 유저만 사용할 수 있으므로 login_decorator를 사용하여 유저의 로그인 유효성 검사와 유저 객체를 가져온다.


2) 데이터 입력 형식

 def post(self, request):
        try:
            data      = json.loads(request.body)
            user      = request.user
            image_url = data["image_url"] #data.get('imgae_url', None)
            postname  = data["postname"]
            contents  = data["contents"]
  • data: request.body에서의 정보
  • user: login_decorator에서 반환된 user 객체
  • 나머지: body를 통해서 입력받아야 하는 값들

3) Posting 객체 생성

Posting.objects.create(
                user       = user,
                image_url  = image_url,
                postname   = postname,
                contents   = contents
            )
  • user = user
    user는 Posting 모델링시 ForeignKey로 만들었으므로 User에 대한 객체를 받아야한다. 그러므로 request.user가 담긴 user를 넣는다.

  • 나머지
    request.body에서 입력 받는 값을 저장한다.

0개의 댓글

관련 채용 정보