이메일 인증은 지금 공부를 하고 있다. 잘 정리해서 내일 TIL로 써야할 것 같다. 너무 늦었다.
장고 기본 유저에 기능 추가하여 사용하기
AbstractUser : 장고의 기본 유저 모델
장고 유저 모델 상속받아 사용하기 bio 추가하기 : bio = models.CharField(max_length=256, default='')
장고에서 기본 유저 모델 바꾸기 : AUTH_USER_MODEL = 'user.UserModel'
DB에 변경사항 알려주기 : python manage.py makemigrations
DB에 변경사항 반영하기 : python manage.py migrate
DB에 테이블이 생성 되었는지 확인
장고 기본 유저 기능 추가하여 회원가입 하기
get_user_model : 사용자가 DB에 있는지 확인하는 함수
create_user : 장고 기본 유저를 사용하면 쓸 수 있는 함수
exist_user 변수에 get_user_model 사용하기 : exist_user = get_user_model.objects.filter(username=username) #get_user_model() 괄호를 주의하자.
회원가입 views를 create_user로 변경하기 : UserModel.objects.create_user(username=username, password=password, bio=bio)
장고 기본 유저 기능 추가하여 로그인 하기
비번 암호화 : 장고 기본 유저 모델 사용하면 비번은 자동으로 암호화 됌.
authenticate : 아이디와 비번을 확인하는 함수. DB에 있는지 확인한다.
login : 장고에서 로그인 할 수 있도록 해주는 함수.
authenticate 사용하기 : me = authenticate(username=username, password=password)
login 함수 사용하기 : auth.login(request,me)
로그인 이후 페이지 이동하기
tweet 폴더 만들고 home.html 만들고 복붙
is_authenticated : 유저가 로그인 되어 있는지 확인.
tweet views home 작성
def home(request):
user = request.user.is_authenticated
if user:
return redirect('/tweet')
else:
return redirect('sign-in')
tweet views tweet 작성
def tweet(request):
if request.method == 'GET':
return render(request, 'tweet.home.html') #폴더를 타고 들어갈때는 슬래시.
urls 작성 복붙
tweet urls 연결하기 '' :path('', include('tweet.urls')),
username 띄워주는 화면을 다시 지시 '/' 화면 보여주기 : return redirect('/')
사용자 카드에 데이터 띄워주기
home.html 수정
h6 없애기.
title에 유저네임, text에 바이오 :{{user.username}} {{user.bio}} #me.username이 아니였다. user다.
네비바 수정
로그인 회원가입 버튼은 로그인 되어있다면 username을 띄워주고 아니라면 버튼 보이기 : {{user.username}} 님 반갑습니다!
로그인해야 home.html 볼 수 있도록 수정하기
만약 user가 is_authenticated 라면 보여주고
아니라면 로그인 화면으로 다시 지시 해주기 :
user = request.user.is_authenticated
if request.method == 'GET':
if user:
return render(request, 'tweet/home.html')
else:
return redirect('/sign-in')
로그인 되어있다면 회원가입 페이지 못가도록 수정
만약 로그인 되어있다면
'/' 다시 지시
아니라면 회원가입 페이지 보여주기 :
user = request.user.is_authenticated
if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
if not user:
return render(request, 'user/signup.html')
else:
return redirect ('/')
로그인 되어있다면 로그인 페이지 못가도록 수정
만약 로그인 되어있다면:
'/' 다시 지시:
아니라면 로그인 페이지 보여주기 :
elif request.method == 'GET':
if not user:
return render(request, 'user/signin.html')
else:
return redirect('/')
로그아웃 기능 추가하기
logout 함수 만들기:
auth.logout() 함수 사용하기 :
'/' 다시 지시 :
def logout(request):
auth.logout(request)
return redirect('/')
로그아웃 함수에 로그인 필요하다는 데코레이터 추가하기 :
from django.contrib.auth.decorators import login_required
@login_required
def logout(request):
auth.logout(request)
return redirect('/')
로그아웃 url 설정하기 'logout/' 별칭 logout : path('logout/',views.logout, name='logout'),
로그아웃 버튼 만들기
if 부터 else 까지 복사해서 이름 보여주는 곳에 붙여넣기:
로그인 부분 없애고 수정 <span class ='nav-link'> {{이름 보여주기 }}
바로 윗줄 disabled로 변경:
회원가입을 logout으로 변경 span 부분은 제거 :
<form class="form-inline my-2 my-lg-0">
<ul class="navbar-nav mr-auto">
<li class="nav-item disabled">
<span class="nav-link">{{user.username}}</span>
</li>
<li class="nav-item active">
<a class="nav-link" href="/logout/"> 로그아웃</a>
</li>
</ul>
</form>
게시글 작성하기
home.html 수정하기
action tweet, method post:
csrf_token :
<div class="form-group mb-2" method="post" action="/tweet/"> # 이건 틀린거다. form 에 넣어야 한다.
{%csrf_token%}
<form method="post" action="/tweet/">
{%csrf_token%} # 이게 맞는 코드다.
tweet 함수 수정하기
elif request.method =='POST':
user = request.user
my_tweet = TweetModel()
my_tweet.author = user
my_tweet.content = request.POST.get('my-content','')
my_tweet.save()
return redirect('/')
게시글 보여주기
views 수정
all_tweet = TweetModel.objects.all().order_by('-created_at')
return render(request, 'tweet/home.html', {'tweet':all_tweet})
home.html 수정
코드 복붙
게시글 삭제하기
@login_required
def detail_tweet(request,id):
my_tweet = TweetModel.objects.get(id=id)
tweet_comment = TweetComment.objects.all().filter(tweet_id = id).order_by('-created_at')
return render(request, 'tweet/tweet_detail.html', {'tweet':my_tweet, 'comment':tweet_comment})
url 수정
tweet/delete/id, 별칭 delete-tweet : path('tweet/delete/<int:id>/',views.delete_tweet,name='delete-tweet'),
home.html 에 삭제 버튼 만들기 복붙 :
숙제
게시글 자세히 보기 부분에서는 특정글과 특정글의 댓글만 가져와야한다.
이걸 어떻게 해야할지 몰랐다. 특정 html에 그저 특정 글과 댓글만 띄워주면 되는 것 이었다.
tweet_detail.html 코드 복붙.
urls.py 작성.
path('tweet/<int:id>',views.detail_tweet,name='detail-tweet'),
path('tweet/comment/<int:id>',views.write_comment, name='write-comment'),
path('tweet/comment/delete/<int:id>',views.delete_comment, name='delete-comment'),
모델 복붙.
views 작성
여기서 가져오는 아이디는 게시글의 아이디.
@login_required
def detail_tweet(request,id):
my_tweet = TweetModel.objects.get(id=id).order_by('-created_at')
tweet_comment = TweetComment.objects.all().filter(tweet_id = id)
return render(request, 'tweet/tweet_detial.html', {'tweet':my_tweet, 'comment':tweet_comment})
여기서 가져오는 아이디는 게시글의 아이디.
@login_required
def write_comment(request, id):
if request.method == 'POST':
comment = request.POST.get('comment','')
current_tweet = TweetModel.objects.get(id=id)
TC = TweetComment()
TC.comment = comment
TC.author = request.user
TC.tweet = current_tweet
TC.save()
return redirect('/tweet/'+str(id))
여기서 가져오는 아이디는 코멘트의 아이디.
@login_required
def delete_comment(request, id):
comment = TweetComment.objects.get(id=id)
current_tweet = comment.tweet.id
comment.delete()
return redirect('/tweet/'+str(current_tweet))