Django/INSTA

[Django] 장고 Login, Logout(로그인, 로그아웃) - 인스타 클론코딩

씨주 2024. 3. 24. 09:45

📍 Login, Logout(로그인, 로그아웃)

 

회원가입을 했으니 로그인을 해보자.

 

✅ Login(로그인) 기능 구현

📌 # accounts/forms.py

from django.contrib.auth.forms import AuthenticationForm

class CustomAuthenticationForm(AuthenticationForm):
    pass

 

📌 # accounts/views.py

from django.contrib.auth import login as auth_login

def login(request):
    if request.method == 'POST':
        form = CustomAuthenticationForm(request, request.POST)
        if form.is_valid():
            user = form.get_user()
            auth_login(request, user)
            return redirect('posts:index')

    else:
        form = CustomAuthenticationForm()

    context = {
        'form': form,
    }

    return render(request, 'accounts_form.html', context)

장고의 AuthenticationForm, auth_login을 사용해서 간단하게 기능을 구현할 수 있었다.

 

📌 # accounts/urls.py

path('login/', views.login, name='login'),

 

📌 # _nav.html

<a class="nav-link" href="{% url 'accounts:login' %}">Login</a>

 

 

✅ Login여부에 따라 nav bar 설정

📌 # _nav.html

  {% if user.is_authenticated %}
    <a class="nav-link" href="{% url 'posts:create' %}">Create</a>
    <a class="nav-link disabled" aria-disabled="true">{{ user }}</a>
  {% else %}
      <a class="nav-link" href="{% url 'accounts:signup' %}">Signup</a>
      <a class="nav-link" href="{% url 'accounts:login' %}">Login</a>
  {% endif %}

로그인했을 때만 글 작성버튼과 User ID가 보이도록,

로그인하지 않았을 때는 회원가입버튼과 로그인버튼이 보이도록 nav bar를 수정했다.

 

변경 전
변경 후(로그인 했을 때)

 

✅ 글 작성(Create) 수정

📌 # posts/forms.py

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        # fields = '__all__'
        exclude = ('user', )

User와 Post을 1:N 관계(ForeignKey)로 연결하면서 Post Create시 아래와 같이 User를 설정해야 하는 상황이 발생하였는데 exclude를 설정함으로써 form에서 보이지 않게 설정하였다.

 

 

📌 # posts/views.py

def create(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()
            return redirect('posts:index')
    else:
        form = PostForm()
    context = {
        'form': form,
    }
    return render(request, 'form.html', context)

post save 전에 request user와 post user를 확인한 후 저장함으로써 수작업으로 설정하지 않았음에도 글작성자를 확인할 수 있게끔하였다.

 

✅ Post header에 User ID, Profile가 보이도록 수정

📌 # posts/_card.html

<div class="card-header" style="display: flex; align-items: center;">
    <span style="flex-grow: 1;">
        <img src="{{ post.user.profile_image.url }}" alt="" class="rounded-circle" width="30px">
        {{ post.user }}
    </span>
</div>

 

 

✅ Logout(로그아웃) 기능 구현

📌 # accounts/urls.py

path('logout/', views.logout, name='logout'),

 

📌 # accounts/views.py

from django.contrib.auth import logout as auth_logout

def logout(request):
    auth_logout(request)
    return redirect('posts:index')

로그아웃 후에 로그인화면 or index화면 고민하다 index로 설정!

로그인화면으로 가는 사이트도 많아서 취향차이일 듯하다.

 

📌 # _nav.html

<a class="nav-link" href="{% url 'accounts:logout' %}">Logout</a>

 

로그인했을 때
로그아웃 했을 때

 

이렇게 로그인, 로그아웃 기능도 구현 완료!