urls.py path 추가
path('<str:pk>/detail', views.MemberDetailView.as_view(), 'detail'),
views.py
# 회원정보
class MemberDetailView(DetailView):
template_name = 'member/detail.html'
model = Member
base.html
<li class="nav-item">
<!--request.session.user: pk값-->
<a class="nav-link" href="{% url 'account:detail' request.session.user %}">My Page</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'account:logout' %}">로그아웃</a>
</li>
detail.html
{% extends 'base.html' %}
{% block title %}회원정보{% endblock title %}
{% block contents %}
<h2>회원 정보</h2>
<table class="table">
<tr>
<th width='20%'>이메일</th>
<td>{{member.email}}</td>
</tr>
<tr>
<th>이름</th>
<td>{{member.name}}</td>
</tr>
<tr>
<th>사진</th>
<td>
<img src = '{{member.picture.url}}'>
</td>
</tr>
</table>
{% endblock contents %}
데코레이터 적용
데코레이터란?
기존 함수를 매개변수로 새롭게 변형된 함수로 바꾸어 반환하는 함수
기존 함수코드를 고치지 않고 기능을 추가하는 것이 목적
def hello():
print('Hello World!')
test = hello
hello()
test()
def my_deco(function):
def wrap():
print('---------------------')
function()
print('---------------------')
return wrap
func = my_deco(hello)
func() # wrat()
def hello2():
print("Hello")
func2 = my_deco(hello2)
func2()
@my_deco
def test1():
print('test1')
test1()
@my_deco
def test2():
print('test2')
test2()
매개변수가 있는 함수의 경우
# 매개변수가 있는 함수
def my_deco2(function):
def wrap(name): # decorator를 붙일 함수가 매개변수가 있는 경우 wrap함수에 붙인다.
print('---------------------')
function(name)
print('---------------------')
return wrap
@my_deco2
def greeting(name):
print('Hi', name+'!')
greeting('은우')
decorator.py 생성
from django.shortcuts import redirect
from django.urls import reverse
# 로그인 여부를 체크하는 decorator 함수
# 로그인 안한 경우 login form으로 이동
# decorator 구현: 함수를 받아서 그 함수를 사용하는 함수를 정의한 뒤 반환
def login_required(function):
def wrap(request, *args, **kwargs):
user = request.session.get('user')
if not user: # 로그인 하지 않았다면
return redirect(reverse('account:login'))
return function(request, *args, **kwargs)
return wrap
views.py
로그아웃 코드에 데코레이터 추가
from account.decorator import login_required
# 로그아웃
@login_required
def logout(request):
request.session.clear() # 세션에 저장된 세션데이터를 모두 제거.
return render(request, 'home.html')
로그인한 사람만 자신의 사용자 정보를 볼 수 있도록
views.py
from django.utils.decorators import method_decorator
# 회원정보
# @method_decorator(데코레이터 함수, name ='데코레이터를 적용할 메소드명')
@method_decorator(login_required, name='dispatch')
class MemberDetailView(DetailView):
template_name = 'account/detail.html'
model = Member
fileupload 프로젝트에 있는 fileup app 복사
my_community 프로젝트에 붙여넣기
config/settings.py에 app 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'account',
'fileup',
]
config/urls.py에 경로 추가
path('fileup/', include('fileup.urls')),
DB테이블 적용
python manage.py migrate
글목록은 모두가 볼 수 있게
글쓰기는 로그인한 사람만 볼 수 있게
base.html
{% if not request.session.user %}
<!--로그인 안해야-->
<li class="nav-item">
<a class="nav-link" href="{% url 'account:join' %}">회원가입</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'account:login' %}">로그인</a>
</li>
{% else %}
<!--로그인 했을 때만-->
<li class="nav-item">
<a class="nav-link" href="{% url 'account:detail' request.session.user %}">My Page</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'fileup:register' %}">글쓰기</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'account:logout' %}">로그아웃</a>
</li>
{% endif %}
<!--로그인여부 상관없이-->
<li class="nav-item">
<a class="nav-link" href="{% url 'fileup:list' %}">글목록</a>
</li>
fileup/views.py
from django.utils.decorators import method_decorator
from account.decorator import login_required
# 데코레이터 추가
@method_decorator(login_required, name='dispatch')
class PostRegisterView(FormView):
template_name = 'fileup/register_form.html' # 등록 폼 템플릿
form_class = PostRegisterForm
success_url = reverse_lazy('fileup:list') # 등록 처리 후 이동할 페이지
def form_valid(self, form):
cleaned_data = form.cleaned_data # 검증이 끝난 데이터
# 요청파라미터 조회 -> models.Post 저장 -> insert
title = cleaned_data.get('title')
info = cleaned_data.get('info')
picture = cleaned_data.get('picture')
file = cleaned_data.get('file')
post = Post(title=title, info=info, picture=picture, file=file)
post.save() # insert - 업로드 된 파일이 지정된 디렉토리에 저장된다.
return super().form_valid(form)
'인문학도 개발일지 > 웹프로그래밍' 카테고리의 다른 글
[파이썬][웹크롤링] 도널드 트럼프 트위터 크롤링하기 (15) | 2020.04.12 |
---|---|
[파이썬][pandas] 기업 주식 데이터 불러오기 - DataReader (0) | 2020.04.11 |
[수업노트] django - 회원가입, 로그인, 로그아웃 기능 구현 (0) | 2020.02.29 |
[수업노트] django - 회원가입, 로그인 화면 구현 (0) | 2020.02.27 |
[수업노트] django 페이지네이션 - paginator (0) | 2020.02.20 |