이메일 인증은 지금 공부를 하고 있다. 잘 정리해서 내일 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))
 
 
 
 
 
 

+ Recent posts