[pinterest clone (16)] DetailView를 이용한 개인페이지 구현
웹 프로그래밍

[pinterest clone (16)] DetailView를 이용한 개인페이지 구현

728x90
반응형

createview는 뭔가를 만들어야하니까 form_class랑 (success_url) 성공했을때 redirect할 구간을 정해줬는데 detailview니까 어떤 모델을 쓸지 모델안에 있는 정보를 어떻게 시각화해줄지 그것만 신경써주면된다.

 

1

views.py

class AccountDetailView(DetailView):
    model = User
    template_name = 'accountapp/detail.html'

 

2

detail.html 생성

{% extends 'base.html' %}

{% block content %}

<div>
    <div style="text-align: center; max-width: 500px; margin: 4rem auto;">
        <p>
            {{ user.date_joined }}
        </p>
        <h2>
            {{ user.username}}
        </h2>
    </div>
</div>

{% endblock %}

3

urls.py path 추가

from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path

from accountapp.views import hello_world, AccountCreateView, AccountDetailView

app_name = 'accountapp'

urlpatterns = [
    path('hello_world/', hello_world, name='hello_world'),

    path('login/', LoginView.as_view(template_name='accountapp/login.html'), name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),

    path('create/', AccountCreateView.as_view(), name='create'),
    path('detail/<int:pk>', AccountDetailView.as_view(), name='detail'),
]

 

detailview는 특정유저의 정보를 봐야하는거니까 특정유저 그 계정의 아이디(primary key)가 필요하다. 

<int:pk> 는 int로 pk를 받아오고 결과적으로 몇번유저에 접근할 것인지를 알려준다.

 

4

header.html

<div class="platypus_header">
    <div>
       <h1 class="platypus_logo">Platypus</h1>
    </div>
    <div>
        <span>nav1</span>
        <span>nav2</span>
        <span>nav3</span>
        {% if not user.is_authenticated %}
        <a href="{% url 'accountapp:login' %}?next={{ request.path }}">
            <span>login</span>
        </a>
        {% else %}
        <a href="{% url 'accountapp:detail' pk=user.pk %}">
            <span>MyPage</span>
        </a>
        <a href="{% url 'accountapp:logout' %}?next={{ request.path }}">
            <span>logout</span>
        </a>
        {% endif %}

    </div>
</div>

로그인상태일때 MyPage도 보이게 추가. 이때 pk=user.pk도 줘야한다.

 

5

런서버 접속해보면 user.date_joined와 user.username가 잘 나온다.

6

수정사항: user.date_joined와 user.username 생각해보면 user의 값을 받아오니까 인스타를 생각해보면 다른사람, 연예인 계정에 들어가도 내 정보가 나오게된다. 이것을 수정한다.

class AccountDetailView(DetailView):
    model = User
    context_object_name = 'target_user'
    template_name = 'accountapp/detail.html'
{% extends 'base.html' %}

{% block content %}

<div>
    <div style="text-align: center; max-width: 500px; margin: 4rem auto;">
        <p>
            {{ target_user.date_joined }}
        </p>
        <h2>
            {{ target_user.username}}
        </h2>
    </div>
</div>

{% endblock %}

 

728x90
반응형