본문 바로가기
관리자

Programming-[Backend]/Django

Django로 Pinterest 따라 만들기-6. BootStrap 추가, DetailView 구현

728x90
반응형

 

1. BootStrap 추가

 

디자인을 수정하기 위해서 BootStrap을 추가한다. django에는 Django-Bootstrap4 라는 전용 라이브러리가 있다. 아래 링크에서 확인할 수 있다.

 

https://django-bootstrap4.readthedocs.io/en/latest/index.html

 

우선 설치를 위해서 Installation 페이지에 적혀있는대로 아래 명령어를 터미널에 입력한다.

pip install django-bootstrap4

그리고 설치가 됬다는 것을 알려주기 위해 settings.py의 INSTALLED_APPS에 bootstrap4를 추가한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accountapp',
    'bootstrap4',
]

 

 

QuickStart 페이지에서 {% load bootstrap4 %}, {% bootstrap_from from %} 등의 태그를 확인할 수 있다. 이를 참고하여 아래와 같이 html, css를 수정해본다.

 

login.html

{% load bootstrap4 %} 구문과 {% bootstrap_from from %} 구문을 적용하였다. 이외에, submit 버튼의 class명도 수정하였다. 여기서 bootstrap 문법을 살펴보자. col-6는 너비를 의미하는데, col-12가 부모 객체의 최대 너비를 의미한다. mt-3margin-top의 약자로, 3은 기존 margin의 3배를 하겠다는 의미가 된다. 

{% extends 'base.html' %}
{% load bootstrap4 %}

{% block content %}
    <div style="text-align: center; max-width: 500px; margin: 4rem auto">
        <div>
            <h4>Login</h4>
        </div>
        <div>
            <form action="{% url 'accountapp:login' %}" method="post">
                {% csrf_token %}
{#                {{ form }}#}
                {% bootstrap_form form %}
                <input type="submit" class="btn btn-dark rounded-pill col-6 mt-3"/>
            </form>
        </div>
    </div>
{% endblock %}

 

create.html

{% load bootstrap %}, {% bootstrap_form from %}을 적용한다.

 

{%  extends 'base.html' %}
{% load bootstrap4 %}

{% block content %}
    <div style="text-align: center; max-width: 500px; margin: 4rem auto">
        <form action="{% url 'accountapp:create' %}" method="post">
            {%  csrf_token %}
            {% bootstrap_form form %}
            <input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
        </form>
    </div>
{% endblock %}

 

 

나눔 글꼴 설치

본문의 내용을 네이버 나눔 글꼴로 적용해보면서 .otf 파일을 적용하는 방법에 대해서도 배운다. 나눔글꼴 페이지에 들어가서 나눔스퀘어 글꼴을 다운로드 받자.

 

 

그리고 일부 .otf 파일을 static/fonts 폴더에 넣는다.

그리고 head.html 파일에 다음 코드를 추가한다.

<style>
    @font-face {
        font-family: 'NanumSquareR';
        src: local('NanumSqureR'),
        url("{% static 'fonts/NanumSquareR.otf' %}") format("opentype");
    }
    @font-face {
        font-family: 'NanumSquareEB';
        src: local('NanumSqureEB'),
        url("{% static 'fonts/NanumSquareEB.otf' %}") format("opentype");
    }
    @font-face {
        font-family: 'NanumSquareB';
        src: local('NanumSqureB'),
        url("{% static 'fonts/NanumSquareB.otf' %}") format("opentype");
    }
    @font-face {
        font-family: 'NanumSquareL';
        src: local('NanumSqureL'),
        url("{% static 'fonts/NanumSquareL.otf' %}") format("opentype");
    }
</style>

 

그러면 base.html 파일의 body에 style을 적용할 수 있게 된다.

 

<!DOCTYPE html>
<html lang="ko">
{% include 'head.html' %}
<body style="font-family: 'NanumSquareR'">

 

 

 


 

2. DetailView 구현

 

views.py

사용자가 로그인 시에 profile을 조회할 수 있는 detailView를 CBV로 작성한다. createView와 거의 유사하다. 다만 POST가 아니라 GET이기 때문에 제출할 form을 결정하는 form_class 라던가, 성공시 redirect를 지정하는 sueccess_url 속성으 필요하지 않다.

 

class AccountDetailView(DetailView):
    model = User
    context_object_name = 'target_user'
    template_name = 'accoutnapp/detail.html'

view를 작성하고나면, template과 route(url)을 해줘야함을 이제 알 수 있다.

 

detail.html

user 모델로부터 date_joined, username값을 가져와서 렌더링해준다.

{% extends 'base.html' %}
{% load bootstrap4 %}

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

 

urls.py

다른 것과 유사하지만, 여기서는 url path에 사용자의 id 정보(정확하게는 primary key)가 담겨야 하므로 <int:pk> 를 추가해준다.

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

 

header.html

메인페이지에서 detail에 접근할 수 있도록 링크를 추가해준다. detail을 볼 수 있는 것은 사용자가 로그인 했을 때이므로 if문 내에 작성해준다.

 

 

...생략
{% 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>
...생략

 

 

 


3. TargetUser 변경

 

detail 페이지에서 user의 정보를 불러왔다. 그런데 이 user라는 model은 로그인한 사용자의 정보이다. 이것은 원래 페이지의 기획 의도인 다른 사용자의 정보를 볼 수 있는 것과 일치하지 않는 개념이므로 user model을 다른 값으로 변경해주어야 한다.

 

context_object_name 값을 detailView에서 받아와서 'target_user'라는 값으로 표기해준다.

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

이제 detail.html 페이지에 이 target_user에 대한 값을 표시하도록 변경해주면 다른 사람의 profile을 조회할 수 있는 view가 완성된다.

<p>
    {{ target_user.date_joined }}
</p>
<p>
    {{ target_user.username }}
</p>

 


 

참조

1. 작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지-박형석님 인프런 강의

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8/dashboard

 

 

728x90
반응형