📍 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>
이렇게 로그인, 로그아웃 기능도 구현 완료!
'Django > INSTA' 카테고리의 다른 글
[Django] 장고 Signup(회원가입) - 인스타 클론코딩 (0) | 2024.03.19 |
---|---|
[Django] 장고 User모델링 - 인스타 클론코딩 (0) | 2024.03.17 |
[Django] 장고 CRUD기능 중 UPDATE - 인스타 클론코딩 (0) | 2024.03.16 |
[Django] 장고 CRUD기능 중 DELETE - 인스타 클론코딩 (0) | 2024.03.15 |
[Django] 장고 CRUD기능 중 CREATE - 인스타 클론코딩 (0) | 2024.01.21 |