상세 컨텐츠

본문 제목

[Django] 모델 변경하기

Python/Django

by TUZA 2022. 9. 28. 00:37

본문

게시판의 질문, 답변에는 누가 글을 작성했는 지 알려주는 "글쓴이" 항목이 필요하다.

이번에는 Question 과 Answer 모델에 "글쓴이" 에 해당되는 author 속성을 추가하자.

 

Question 속성 추가

 

from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class Question(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()


'''
author 필드는 User모델을 ForeginKey로 적용하여 선언했다.
User 모델은 django.contrib.auth 앱이 제공하는 사용자 모델로 회원 가입 시 데이터 저장에 사용했던 모델이다.
모델을 변경한 후에는 반드시 makemigrations 와 migrate 를 통해 데이터베이스를 변경해 주어야한다.


'''


def answer_create(request, question_id):
    '''
    pybo 답변등록
    '''
    question = get_object_or_404(Question, pk = question_id)
    if request.method =='POST':
        form = AnswerForm(request.POST)
        if form.is_valid():
            answer = form.save(commit=False)
            answer.author = request.user # author 속성에 로그인 계정 저장.

#request.user 은 현재 로그인한 계정의 User 모델 객체이다.

 

#login_required 어노테이션

request.user 에는 로그아웃 상태이면 AnonymousUser 객체가, 로그인 상태면 User 객체가 들어있는데, 앞에서 우리는 author 속성을 정의할 때 User를 이용하도록 했다. 그래서 answer.author = request.user 에서 User 대신 AnonymousUser 가 대입되어 오류가 발생한다. 이 문제를 해결하려면 request.user 를 사용하는 함수에 @login_required 에너테이션을 사용해야한다. 

해당 에너테이션이 붙은 함수는 로그인이 필요한 함수이다.

from django.core.paginator import Paginator
from django.contrib.auth.decorators import login_required

(... 생략 ...)

@login_required(login_url='common:login')
def answer_create(request, question_id):
    (... 생략 ...)

@login_required(login_url='common:login')
def question_create(request):
    (... 생략 ...)

 

 

#disabled

만약 로그인이 되어있지 않다면 댓글을 못 달게하고 싶다. 그렇다면 다음과 같이 작성해보자.

<div class="mb-3">
        <label for="content" class="form-label">답변내용</label>
        <textarea {% if not user.is_authenticated %} disabled {% endif %} name="content" id="content" class="form-control" rows="10"></textarea>
		#만약 로그인이 안되어있다면 disabled 속성을 추가한다.
</div>

 

 

반응형

'Python > Django' 카테고리의 다른 글

[Django] 회원가입  (0) 2022.09.25
[Django] 로그인과 로그아웃(작성중)  (0) 2022.09.23
[Django] 템플릿 필터 함수  (0) 2022.09.23
[Django] 페이징  (1) 2022.09.22
[Django] 네비게이션바  (1) 2022.09.22

관련글 더보기