728x90
반응형
오늘 팀원분들이랑 git 연습을 해봤다. 뿌듯 풀리퀘스트까지 성공 ^^7
로그인 후 보일 페이지 만들기
<aside> 💡 ✨기본적인 로직✨ html을 연결할 때 기본적으로 views.py에 render() 함수를 사용하고, 작성한 views.py의 함수를 urls.py에 연결시킨다.
</aside>
- templates 폴더 안에 tweet 폴더 만들고 그 안에 home.html 만들기
- {% extends 'base.html' %} : base.html을 기본으로 가져오고, 남는 공간 즉 content라는 공간에다가 코드를 확장해서 작성한다.
- 이동 페이지(→home.html)를 연결 할 url과 view를 연결해야 하는데, views 먼저 작업
- from django.shortcuts import render에서 추가적으로 redirect를 import한다.
- user = request.user.is_authenticated : is_authenticated는 장고가 제공하는 사용자 모델을 사용했을 때 쓸 수 있는 함수로, 사용자가 인증을 받았는지, 즉 로그인이 되었는지 검사해준다.
- if user : : 만약 로그인 된 사용자라면
- return : redirect(’/tweet’) : /tweet이라는 url 주소로 다시 보내준다.
- else : return redirect(’/sign-in’) : 로그인이 안 됐다면 로그인 페이지를 띄운다.
- home() 함수에서 사용자의 로그인 여부를 확인하가 로그인 여부에 따라 보여줄 페이지를 나눈다.
- #tweet 안의 home.html을 보여주는 함수 **def tweet(request): if request.method == 'GET': return render(request, 'tweet/home.html')**
- urls.py를 작업해준다.
- tweet 앱 안에 urls.py 생성
- # tweet/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), # 127.0.0.1:8000 과 views.py 폴더의 home 함수 연결 path('tweet/', views.tweet, name='tweet') # 127.0.0.1:8000/tweet 과 views.py 폴더의 tweet 함수 연결 ]
- Django가 앱 단위에서 urls.py를 생성해 경로를 설정해주고 있음을 알아채고 관리할 수 있도록 처음 만들었던 폴더의 urls.py에 해당 경로를 등록해 주어야 한다.⇒ urlpattenrs 안에 path('', include('tweet.urls')) 추가
- 참고로 프로젝트와 같이 생성된 settings.py는 프로젝트의 모든 환경설정을 담당하고, urls.py는 프로젝트의 모든 접속 경로를 담당한다.
- 로그인 시 ‘로그인 성공’ 글자가 아닌 home.html이 나오도록 user 앱의 veiws.py의 코드를 수정한다.
- ⇒ return HttpResponse("로그인 성공") → return redirect('/')
로그아웃 기능 만들기
- 로그인 한 사람만 페이지에 접근 가능하게 만들기
- tweet앱의 views.py의 tweet 함수 수정
- 로그인 한 사람은 사용 안 해도 되는 페이지 기능 만들기 ⇒ 로그인 한 사용자가 회원가입과 로그인 페이지로 들어가지 않고 기본 페이지로 돌아가게 하기
- user 앱의 views.py의 sign_up_view 함수 수정 - 회원가입 페이지 차단
- user 앱의 views.py의 sign_in_view함수 수정 - 로그인 페이지 차단
- user 앱의 views.py에 코드 추가 - 로그아웃 버튼 넣기
게시글 작성하기
- 글 작성 할 html 만들기 - templates 폴더 안에 tweet 폴더 속 home.html
- textarea의 name과 id가 my-content로 되어 있다.
- 여기에 action과 method를 이용해 django의 url로 연결시켜 주면 된다.
- {% csrf_token %} : form 안에서 무조건 암호화 정보를 보내줘야 한다.
- <h5 class="mt-0">나의 이야기를 적어주세요</h5> <p> ~~<form>~~ **<form action="/tweet/" method="post">** **{% csrf_token %}** <div class="form-group mb-2"> <textarea class="form-control" style="resize: none" name='my-content' id="my-content"></textarea> </div> <button type="submit" class="btn btn-primary" style="float:right;">작성하기</button> </form>
- 글을 저장 할 view 만들기
- path('tweet/', views.tweet, name='tweet') : tweet앱의 urls.py를 확인해보면 /tweet이 view의 tweet 함수와 연결되어 있으므로, tweet 함수를 수정해 준다.
**from .models import TweetModel # 글쓰기 모델 -> 가장 윗부분에 적어주세요!** def tweet(request): if request.method == 'GET': # 요청하는 방식이 GET 방식인지 확인하기 user = request.user.is_authenticated # 사용자가 로그인이 되어 있는지 확인하기 if user: # 로그인 한 사용자라면 return render(request, 'tweet/home.html') else: # 로그인이 되어 있지 않다면 return redirect('/sign-in') **elif request.method == 'POST': # 요청 방식이 POST 일때 user = request.user # 현재 로그인 한 사용자의 정보 전체를 불러오기 my_tweet = TweetModel() # 글쓰기 모델 가져오기 my_tweet.author = user # 모델에 사용자 저장 my_tweet.content = request.POST.get('my-content', '') # 모델에 글 저장 my_tweet.save() return redirect('/tweet')**- home.html의 form 태그에서 textarea를 넘겨주므로, textarea의 name인 my-content를 POST 형식로 가져온다.
- my_tweet.content = request.POST.get('my-content','') : POST 형식으로 요청한 데이터의 id와 name을 가지고 온다.
- user = request.user : 장고에서는 요청에 자동적으로 인증을 추가한다. 현재 요청이 누구에게서 요청 된 것인지 확인 할 수 있다.
게시글 읽어오기
- 게시글 읽기
- 로그인된 상태에서 게시글을 읽어와야 하니까 tweet 앱의 views.py에 로그인 사용자를 검증한 후 TweetModel을 불러 주는 기능을 작성해 준다.
- all_tweet = TweetModel.objects.all().order_by('-created_at') → 타임라인은 최신 글이 가장 상단에 있기 때문에 TweetModel을 created_at 생성 시간의 역순으로 불러오는 코드
- return render(request, 'tweet/home.html', {'tweet': all_tweet}) → 처음보는 형식이지만, tweet/home.html을 화면에 띄우면서 {'tweet':all_tweet} 라는 딕셔너리 형태의 데이터를 전달한다.
- def tweet(request): if request.method == 'GET': # 요청하는 방식이 GET 방식인지 확인하기 user = request.user.is_authenticated # 사용자가 로그인이 되어 있는지 확인하기 if user: # 로그인 한 사용자라면 **all_tweet = TweetModel.objects.all().order_by('-created_at') return render(request, 'tweet/home.html', {'tweet': all_tweet})**
- 읽어온 게시글 화면에 노출시키기
- templates 의 tweet 폴더 내부에 작성 된 home.html에서 return render(request, 'tweet/home.html', {'tweet': all_tweet})로 읽어온 게시물을 리스트에 넣어 for문을 돌아준다.
- 로그인된 상태에서 게시글을 읽어와야 하니까 tweet 앱의 views.py에 로그인 사용자를 검증한 후 TweetModel을 불러 주는 기능을 작성해 준다.
게시글 삭제하기
💡 1. 게시글은 각각의 고유한 id 번호를 가지기 때문에, 이를 이용해 어떤 게시글을 지울지 판단해 줄 수 있다. 2. 삭제 할 기능을 추가할 url : http://127.0.0.1:8000/tweet/delete/게시글의id
- 게시글 삭제 view 만들기 - tweet 앱의 views.py
- 함수의 매개변수로 id가 추가되었다. 이 id는 게시글을 구분하는 데 사용할 변수에 해당한다.
- 게시글 삭제 url 만들고 views의 함수와 연결
- tweet/delete/<int:id> : tweet/delete/123 과 같이 맨 뒷자리에 숫자가 온다는 얘기이고, 이 숫자는 id에 담겨져 delete_tweet에 전달된다.
- 이 id를 views.py의 delete_tweet(request,id) 에서 매개변수로 사용한다.
- home.html에 게시글 삭제 url 넣어주기
- 게시물의 번호는, 각 게시물을 출력 할 때에 따라 오는 번호를 대입해준다.
- templates 폴더의 tweet내에 작성 되어있는 home.html 수정
- 이 게시글의 author (글쓴이) 와, 로그인 한 사용자가 같을 때에만 '삭제' 버튼이 나타난다.
- 삭제 버튼은 /tweet/delete/tw.id 로 연결이 되는데, 이 tw.id는 게시글의 고유 id값이다.
반응형
'Programming > TIL and WIL' 카테고리의 다른 글
| 220929 Today I Learned (TIL) (0) | 2022.09.30 |
|---|---|
| 220928 Today I Learned (TIL) (2) | 2022.09.28 |
| 220926 Today I Learned (TIL) (0) | 2022.09.26 |
| WIL (1) | 2022.09.26 |
| 220923, 220924 Today I Learned (TIL) (0) | 2022.09.24 |