vscode를 이용한 웹구축(html)

python migrations, 게시글작성자노출,수정,삭제 구현

LRWoo 2023. 4. 23. 19:31
728x90
반응형

2023.04.23 - [파이썬을 이용한 웹구축] - 파이썬 장고 로그인,회원가입구현하기

 

파이썬 장고 로그인,회원가입구현하기

admin 계정으로 로그인을 해보면 이렇게 accounts profile을 찾을 수 없다는 에러가 뜬다 config -settings.py로가서 맨 아래에 로그인 url을 추가해준다. config폴더에 url.py로가자 위 코드는 Django 앱의 URL 패

ji7290.tistory.com

 

로그인이 되어있는 상태에서 진행하도록하자

 

 

 

 관리자페이지로 넘어가자 

 

 

 

 admin이 아닌 일반사용자로는  접근권한이 없다.

 

admin으로 로그인을 일단해보자

 

 

admin페이지에서  사용자들의 정보를수정할 수도 있고 

어느그룹에 속해있는지, 접속시간은 언제인지  확인할 수 있다.

 

 

로그아웃후 

다시 게시판으로 돌아가서 

test1으로  로그인해준 뒤,  일반사용자 test1이 글작성을 할 수 있는지 확인해보자 

게시글,댓글작성이 잘된다.

 

하지만 게시글과 댓글 을 누가 작성했는지 알 수있는 방법이 없다. 

아직 이 글쓴이에대한 속성이 안잡혀있다.

 

아이디가  게시글목록에 나타나게만들어보자. 

 

board에 models.py로가자

장고가 제공하는 내부기능인 contrib를 import시켜주고 

 

변수 author를 선언해서 사용자가 삭제되면 사용자가 작성했던 글들을 지울 수 있게 만들어준다.

from django.contrib.auth.models import User
    author = models.ForeignKey(User, on_delete=models.CASCADE)

모델 바뀐게있기 때문에 서버를 끊고 

마이그레이션 해줘야한다. 

 

 

python manage.py makemigration 엔터 

선택지를 두가지준다

1번 엔터

여기서 선택한 1이 

이미작성된 게시글에 대해서 모든 게시글의 작성자를 1로 넣어준다. 

 

 

 

0001 이름으로 ~한거다 라고 간단하게 알려주고있는 것이다

 

board -> migrations에  들어가서 0002번 author를 확인하면 

마이그레이션이 생성되어있다.

 

 

마이그레이션후에는 무조건 

python manage.py migrate로 를 입력해줘야한다. 

 

answer쪽에도 author를 추가시켜준다.

author = models.ForeignKey(User, on_delete=models.cascade)

author변수를 models에 사용자로 지정해주고 사용자가 탈퇴하면 이전에 썻던 게시글을 전부삭제해준다

 

 

models.py를 수정해줬으니 또 마이그레이션을 해준다.

 

python manage.py makemigrations입력

1번 

1번

 python manage.py migrate

 

이제 board에 views.py로가서 

answer,question에 author를 추가시켜준다

board - anwer함수
board-question함수

 

 

이제 서버를 열어준다.

웹이미지

 

글작성을 해보면  아직 나오는게없다

다만 누가 어느게시글에 어떤 게시글을 남겼는지 admin페이지에서는 확인이가능하다 

 

 

 

로그아웃한 상태에서 글작성해보자 

지금 게시글을 작성한 익명의 사용자가 user 인스턴스를 가지고있지않아서 에러가뜬다.

 

 

 

 

로그인을 한 상태에서만 게시글,댓글작성을 할 수 있게 만들어보자

 

board -views.py로가자

장고 내부기능인

contrib.auth.decorations 을  login_required에 import시켜주고 

 

c_answer, question에 

login_required를 어노테이션시켜준다 

 

 

이 함수는 다음 두가지의 조건으로 로그인된 사용자만 이용할 수 있게 만드는것이다.

1.로그인이 필요하다 -> 로그인이 안되어있을때 login페이지로 이동시켜주겠다.

 

 

다시 로그아웃상태에서 글작성을 누르면 

로그인 페이지로 넘어가게된다. 

하지만 글작성을 누른뒤 보이는 로그인화면에는 

8000/common/login/?next=/board/question/create/  사이트주소가 다르다.

 

login.html에서

templates -common-login.html

next라는 변수를 이용해서 next = (이자리에 할당시켜준다)

 

 

로그아웃 상태로  댓글 작성을 눌렀을때 작성권한을 없애준다.

 

 

templates-board-q_detail.html

textarea부분을 수정해서 조건문으로  유저가 익명이면 textarea를 막는다 

 

 

로그아웃한상태로 게시글에 들어가서 댓글폼을 확인해보자 비활성화되어있다. 

 

게시글 목록에 글쓴이가 안나온다. 

q_list.html <table>영역에 작성자 필 <th>가 없기때문이다. 

 

table부분 작성자 행 추가

 

userName값을 할당

 

 

이제 댓글창에 작성자를 넣어보자 

 

q_detail.html로 가자 

 

게시글,댓글의 div영역에 question.author.username을 할당시켜서 

댓글부분의 게시글, 댓글작성자를 노출시킨다.

 

<div class="mb-2">{{ question.author.username }}</div>
                    <div class="mb-2">{{ answer.author.username }}</div>

 

 

 

웹이미지

 

 

회원가입,로그인, 게시글,댓글작성, 작성자 노출까지 구현시켜보았다.

 

 


 

 

이제 수정,삭제를 구현해보자

 

models.py로가자

board - models.py

질문, 답변 클래스에 

modify_date변수를 선언해주고 null값 true, blank true  널값과 빈칸이 참을 허용할 수 있도록 할당시켜준다.

 

모델.py수정해줬으니 서버끊어주고 마이그레이션해주자

수정기능을 작동할 수있는 migrations가 생겼다. 

 

 

q_detail.html로가서  수정할 수 있는 영역을 만들어준다. 

 

 <div class="my-3">
                {% if request.user == question.author %}
                <a href="{% url 'board:m_question' question.id %}" class="btn btn-sm btn-outline-secondary">수정</a>
                {% endif %}
            </div>

 

m_question이 없기때문에 만들어준다.

 

board - urls.py로가서 path추가해준다

path에 question/modify/int형정수로 사이트경로를 할당해주고 

views에 m_question을 사용해서 이름은 m_question으로 지정하겠다는 의미이다. 

 

views.py에 m_question 함수를 생성한다

엉뚱한 사용자로 로그인을해놓고 주소창 맨끝에 번호를 바꿔서

다른 사용자의 게시글을 함부로 수정할 수 없게 만들어준다.

board-views.py

 

중요)


이 구문은  수정 페이지를 처리하는 함수

이는 이 함수에 접근하기 위해서는 로그인이 필요하며, 로그인하지 않은 경우 `common:login` URL로 리디렉션된다.

question_id 를 매개변수로 받아 해당하는 `Question` 객체를 `get_object_or_404()` 함수로 가져온다.

그 후에는 현재 로그인한 사용자가 해당 question 의 작성자인지 확인한다

만약 그렇지 않은 경우에는 `messages.error()` 함수로 에러 메시지를 생성하고

redirect()`함수로 상세 페이지로 이동

request.method`가 "POST"인 경우, `QuestionForm`을 인스턴스화하고 요청된 POST 데이터와 함께 제출

만약 유효한 데이터인 경우, 수정된 질문을 저장하고 상세 페이지로 리디렉션한다.

`request.method`가 "POST"가 아닌 경우, `QuestionForm`을 기존 `question` 객체의 인스턴스로 생성

마지막으로, `form`과 함께 `board/q_form.html` 템플릿을 렌더링하고, 결과를 `context` 변수에 저장하여 반환한다.

 

게시글을 눌렀을때 수정버튼 생성

 

수정버튼을 누르면 수정이 잘된다.


test3로 로그인이되어있다 

그러나 307번 게시글은 test1이 작성한 게시글이다  

url을 307번으로 임의로 수정해서 게시글을 수정하려고하니

 

수정버튼이 사라져있다. 또는 경고메세지가뜬다. 다른사용자의 게시글을 함부로 수정할 수 없게 막아뒀다.

 

다음은 댓글 수정, 게시글 수정,삭제를 배워보자

728x90
반응형