본문 바로가기

인문학도 개발일지/웹프로그래밍

[수업노트] django - 회원정보 조회

 

 

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)