[django] 점프 투 장고 - 장고 심화 7, 8

Joy·2020년 6월 27일
0

Django | 점프투장고

목록 보기
16/22

모델변경

Question과 Answer 모델에 "글쓴이"에 해당되는 author 속성 추가

Question 속성추가

Question모델에 author 속성을 추가

from django.contrib.auth.models import User

class Question(models.Model):
    
    author = models.ForeignKey(User, on_delete=models.CASCADE)

모델을 변경후에는 makemigrations와 migrate를 통해 데이터베이스를 변경필수

(mysite) c:\projects\mysite>python manage.py makemigrations

추가된 author 속성은 null을 허용하도록 설정하지 않아서 옵션 선택해야함.
1. author 속성을 null로 설정하는 방법
2. 이미 등록된 데이터의 author 값을 강제로 추가하는 방법




Answer 속성추가

위와같음

속성 적용

Question과 Answer 모델에 author라는 속성이 추가되었으니까 질문등록과 답변등록하는 프로그램에도 author를 추가하도록 수정

views에 함수 수정

answer_create함수, q_create 함수

 answer.author = request.user  # 추가한 속성 author 적용
 question.author = request.user  # 추가한 속성 author 적용
  • reqeust.user는 현재 로그인한 계정의 User모델 객체

※ request.user는 로그인 전에는 AnonymousUser객체가 매핑되고 로그인한 후에는 User객체가 매핑된다.



로그인이 필요한 함수

로그인이 필요한 함수에 @login_required 어노테이션을 사용

로그아웃 상태에서 질문 또는 답변을 등록하면 다음과 같은 ValueError가 발생 - request.user가 User객체가 아니라 AnonymousUser객체이기 때문

함수 수정

from django.contrib.auth.decorators import login_required
@login_required(login_url = 'common:login')
def xxxx ....
  • answer_create 함수와 question_create 함수는 함수내에서 request.user를 사용하므로 로그인이 필요한 함수. @login_required 어노테이션을 사용

  • 로그아웃 상태에서 위 어노테이션 적용된 함수가 호출되면 자동으로 로그인 화면으로 이동(로그인 URL을 지정해줌)



next

  • 자동 로그인 화면의 url보면 next 파라미터 있음. but 이동하지 않음. why? 로그인 템플릿에 hidden 항목을 추가 필요

    next파라미터의 의미 : 로그인이 성공한 후에 next에 해당되는 URL로 이동되어야 한다

template 수정 [login.html]

 <input type="hidden" name="next" value="{{ next }}">  <!-- 로그인 성공후 이동되는 URL -->



disabled

문제: "답변등록"에서 로그아웃 상태에서 글 작성하고 버튼 누르면 로그인 화면 이동 + 작성한 글 사라짐

해결: 아예 글 작성 못하게 막기

template 수정 [question_detail.html]

div class="form-group">
    <textarea {% if not user.is_authenticated %}disabled{% endif %}
              name="content" id="content" class="form-control" rows="10"></textarea>
</div>
  • 로그인 상태가 아니라면 disabled 를 지정하여 입력자체를 불가능하도록 설정



글쓴이 표시

상세조회 화면에도 글쓴이를 적용



목록 조회

목록조회 템플릿에 글쓴이를 표시하기

template [question_list.html]

  • 테이블 헤더에 <th>글쓴이</th> 컬럼을 추가

  • 내용부분에도 글쓴이 적용

상세조회

template [question_detail.html]

<div class="badge badge-light p-2 text-left">
            <div class="mb-2">{{ answer.author.username }}</div>
            <div>{{ answer.create_date }}</div>
        </div>
  • 기존 날짜 정보 위에 추가해줌.





profile
roundy

0개의 댓글