카테고리 없음

개발 일지-2 게시판 만들기

sorecord 2024. 8. 16. 12:49

코드를 짜기 전 그림판에 대충 그림을 그려서 흐름도(?)를 그렸다.

게시판 흐름도

나는 알아볼 수 있으니까 괜찮다. 

 

어제 로그인 하자마자 옆에 게시판이 생성되는 것은 일단 잠시 접어두고 글쓰기 버튼을 클릭할 시에 게시판으로 넘어가는 것으로 바꿨다.

 

게시판 요소에는 제목, 카테고리, 내용, 상태(공개,비공개), 태그 이런 식으로 구성이 되어있다. 

모델 즉, 새로 만들 데이터베이스에는 위와 같은 내용과 함께 조회수, 입력 날짜 , 수정 날짜, 글쓴이값들이 저장될 수 있게 만들었다. 

 

일단 class를 만들고 뚝딱뚝딱하다보면 

 

class Post_information(models.Model):
    STATUS_CHOICES = [
        ('published', '공개'),
        ('unpublished', '비공개'),
    ]

    title = models.CharField(max_length=255, null=False)                  # 제목
    content = models.TextField(null=False)                                # 내용
    category = models.CharField(max_length=100, blank=True)               # 카테고리
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='published')  # 상태
    author = models.ForeignKey(User_information, on_delete=models.CASCADE)  # 작성자
    created_at = models.DateTimeField(auto_now_add=True)                  # 작성일
    updated_at = models.DateTimeField(auto_now=True)                      # 수정일
    tags = models.ManyToManyField('Tag', blank=True)  # 태그 추가
    views = models.IntegerField(default=0)  #조회수
    
    def __str__(self):
        return self.title
 

이런 코드가 만들어진다. 참고로 글쓴이는 user_information이라는 데이터베이스에 저장을 해두었기 때문에 외래키로 엮었다. 

외래키는 간단히 말해서 2개의 테이블을 연결해주는 다리 역할이라고 볼 수 있다. 

 

이후에 form.py값도 작성을 하고 글쓰기 버튼을 누르면 게시판 html로 바뀌는 코드까지 구현을 했다. 

여기까지는 큰 문제가 없었다.

 

이제 글을 적고 데이터베이스에 저장을 하는 과정을 구현해야 하는데 회원가입을 할 때 했던 경험이 있어서 수월하게 끝날 줄 알았다.

 

원래는 아래 코드처럼 적으면 데이터베이스에 바로 저장이 되어야 한다. 

 

if request.method == 'POST':
        print('POST request received') 
        form = UserForm(request.POST)
        
        if form.is_valid():
            form.save()  # 모델에 데이터 저장

 

그런데 이상한 오류창이 떴고 찾아보니까 글쓴이의 값이 null이되면 안된다고 말했다.

 

무슨 소리인가 싶었더니 게시글에 제목이나 내용 태그 카테고리등은 내가 다 작성을 해서 값을 넘기는데 글쓴이의 값은 따로 저장을 안했다는 것을 깨닫고 수정을 했다. 

 

 

user_id = request.session.get('username')  # 세션에 저장된 사용자계졍의 값을 가져온다.
    if request.method == 'POST':
        print('POST POST request received') 
        
        print("현재 로그인된 사용자:",user_id )
        form = PostForm(request.POST)
        
        if form.is_valid():
            post = form.save(commit=False)  # 모델 인스턴스를 생성하되 아직 저장하지 않음
            
            post.author=  User_information.objects.get(username=user_id)#바로 세션값을 사용할 수 없어서 인스턴스 값을 사용을 해준다.
            post.save()

 

최종적으로는 위와 같이 수정을 해주었다. 이렇게 만들기까지 긴 시간이 걸렸다. 

처음에 requset.user값을 이용을 했는데 그 값을 print해보니까 admin값이 나와서 이게 무슨 일인가 싶었다. 그리고 로그인하는 화면에서 user_id를 전역변수로 바꿔서 위에 함수에서 사용하려다가 전역변수를 하면 좋지 않다는 소리가 생각이 나서 수정을 거듭했다.

 

결국 나온 결론이 session을 이용하는 거다. 로그인을 성공할떄 세션 값을 저장을 해주고 바로 post.author에 넣으니까 문제가 또 생겼다. User_information의 인스턴스(?)값을 사용을 해줘야 한다길래 이게 무슨 소리인가 하고 생각했더니 위에서 내가 했던 외래키의 영향이 아닐까 추측했는데 맞았다.

 

Django에서 모델 간의 관계(특히 외래 키 관계)에 따라 특정 필드를 설정할 때는 해당 필드가 요구하는 데이터 타입을 맞춰야 한다. 

 

Post_information 모델에서 author 필드는 User_information 모델의 인스턴스를 참조하는 외래 키 필드다. 

즉, author 필드는 User_information의 인스턴스를 필요로 하며, 문자열(즉, 세션 값을 바로 사용할 수 없는 이유) 같은 다른 데이터 타입을 사용할 수 없습니다.

 

이렇게 게시판의 값들을 데이터베이스에 저장하는데 성공했다. 

 

추가해야 할 것들을 정리해보면 글을 적은 날짜가 데이터베이스에 저장이 안되는 문제를 해결하고 태그하고 글을 공개했을때와 비공개로 바꿨을때 달라지는 것들도 해결해야 한다. 

 

오늘은 여기까지