728x90
반응형

오늘 팀원분들이랑 git 연습을 해봤다. 뿌듯 풀리퀘스트까지 성공 ^^7

로그인 후 보일 페이지 만들기


<aside> 💡 ✨기본적인 로직✨ html을 연결할 때 기본적으로 views.py에 render() 함수를 사용하고, 작성한 views.py의 함수를 urls.py에 연결시킨다.

</aside>

  1. templates 폴더 안에 tweet 폴더 만들고 그 안에 home.html 만들기
    • {% extends 'base.html' %} : base.html을 기본으로 가져오고, 남는 공간 즉 content라는 공간에다가 코드를 확장해서 작성한다.
  2. 이동 페이지(→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')**
  3. 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는 프로젝트의 모든 접속 경로를 담당한다.
  4. 로그인 시 ‘로그인 성공’ 글자가 아닌 home.html이 나오도록 user 앱의 veiws.py의 코드를 수정한다.
  5. ⇒ return HttpResponse("로그인 성공") → return redirect('/')

로그아웃 기능 만들기


  • 로그인 한 사람만 페이지에 접근 가능하게 만들기
    1. tweet앱의 views.py의 tweet 함수 수정
  • 로그인 한 사람은 사용 안 해도 되는 페이지 기능 만들기 ⇒ 로그인 한 사용자가 회원가입과 로그인 페이지로 들어가지 않고 기본 페이지로 돌아가게 하기
    1. user 앱의 views.py의 sign_up_view 함수 수정 - 회원가입 페이지 차단
    2. user 앱의 views.py의 sign_in_view함수 수정 - 로그인 페이지 차단
    3. user 앱의 views.py에 코드 추가 - 로그아웃 버튼 넣기

게시글 작성하기


  1. 글 작성 할 html 만들기 - templates 폴더 안에 tweet 폴더 속 home.html
    • textarea의 name과 id가 my-content로 되어 있다.
    • 여기에 action과 method를 이용해 django의 url로 연결시켜 주면 된다.
    • {% csrf_token %} : form 안에서 무조건 암호화 정보를 보내줘야 한다.
  2. <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>
  3. 글을 저장 할 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 : 장고에서는 요청에 자동적으로 인증을 추가한다. 현재 요청이 누구에게서 요청 된 것인지 확인 할 수 있다.

게시글 읽어오기


  • 게시글 읽기
    1. 로그인된 상태에서 게시글을 읽어와야 하니까 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} 라는 딕셔너리 형태의 데이터를 전달한다.
    2. 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})**
    3. 읽어온 게시글 화면에 노출시키기
      • templates 의 tweet 폴더 내부에 작성 된 home.html에서 return render(request, 'tweet/home.html', {'tweet': all_tweet})로 읽어온 게시물을 리스트에 넣어 for문을 돌아준다.
      •  

게시글 삭제하기


 💡 1. 게시글은 각각의 고유한 id 번호를 가지기 때문에, 이를 이용해 어떤 게시글을 지울지 판단해 줄 수 있다. 2. 삭제 할 기능을 추가할 url : http://127.0.0.1:8000/tweet/delete/게시글의id

 

  1. 게시글 삭제 view 만들기 - tweet 앱의 views.py
    • 함수의 매개변수로 id가 추가되었다. 이 id는 게시글을 구분하는 데 사용할 변수에 해당한다.
  2. 게시글 삭제 url 만들고 views의 함수와 연결
    • tweet/delete/<int:id> : tweet/delete/123 과 같이 맨 뒷자리에 숫자가 온다는 얘기이고, 이 숫자는 id에 담겨져 delete_tweet에 전달된다.
    • 이 id를 views.py의 delete_tweet(request,id) 에서 매개변수로 사용한다.
    이제 view와 url이 연결되어 10번 게시물을 삭제하려면 /tweet/delete/10 이라고 요청하면 된다.
  3.  
  4. 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

+ Recent posts