58.Django Application 추가하기

58.1 coding app 추가 하기 - startapp

python manage.py startapp 앱이름으로 어플리케이션을 생성합니다.

setting파일(base.py)을 열고
INSTALLED_APPS에 들어갈 앱이름을 입력합니다.

생성한 App은(coding) 디렉토리로 옮겼습니다.(myapp/conding)

1
2
3
4
5
6
DJANGO_BASE_APP = [
    ....
]
MY_APP =['myapp.blog','myapp.coding']

INSTALLED_APPS = DJANGO_BASE_APP + MY_APP

58.2 모델 정의하기

Model은 기본적으로 models.Model을 상속받아 사용합니다.

IMG_SIZE_CHOICES는 글작성 시
아래처럼 관리자에서 selectBox로 나타납니다.
{30,30} 에서 왼쪽이 값, 오른쪽이 화면 표시 입니다.

IDJANGO CHOICES

get_absolute_url함수를 미리 만들고
url name은 coding_detail로 정의했습니다.

content_body는 마크다운 적용 필드 입니다. 50 장고 마크다운 설치 / 적용 하기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#myapp/coding/model.py
from django.db import models
from django.urls import reverse
from markdownx.models import MarkdownxField
from markdownx.utils import markdownify

IMG_SIZE_CHOICES = {(30,'30%'),(40, '40%'),(50, '50%'),(70, '70%'),(100, '100%')}

class PyCoding(models.Model):
    id        = models.AutoField(primary_key=True)    
    tags      = models.CharField(max_length=200)
    title     = models.CharField(max_length=100)
    sub_title       = models.CharField(max_length=100, blank=True, null=True)
    img_url         = models.CharField(max_length=200, blank=True, null=True)
    img_size        = models.IntegerField(choices=IMG_SIZE_CHOICES, null=False, blank=False)
    #content_body   = models.TextField(null=False, blank=False) 
    content_body = MarkdownxField()   
    update_dt = models.DateTimeField(auto_now=True)
    regist_dt = models.DateTimeField(auto_now_add=False)

    def get_absolute_url(self):
        if not self.is_root():
            return reverse('coding:coding_detail', kwargs={'pk':self.pk} )

    def __str__(self):        
        return self.title

    class Meta:
        db_table = 'py_coding'
        # ordering = ['regist_dt']

models.py 작성이 완료 되었으면
makemigrations와 migrate로 물리DB를 생성해주세요.

1
2
3
python manage.py  makemigrations

python manage.py migrate

58.3 관리자에 모델 추가히기 - admin.py

모델을 관리자에서 글을 등록할 수 있습니다.

1
2
3
4
5
6
#myapp/coding/admin.py
from django.contrib import admin
from markdownx.admin import MarkdownxModelAdmin
from .models  import PyCoding

admin.site.register(PyCoding,MarkdownxModelAdmin)

58.4 urls.py 맵핑 및 views.py 구현

urls.py에서 url과 view를 맵핑하고 views.py를 구현합니다.

coding/1/이 호출되면 pycoding_detail(html파일)을 찾게 됩니다.

※ html 랜더링 파일을 지정하지 않으면 장고가 정해진 이름의 파일을 찾게 됩니다. - ListView를 상속 받으면 모델명_list.html - DetailView를 상속 받으면 모델명_detail.html

1
2
3
4
5
6
7
8
9
#myapp/coding/urls.py
from django.urls import path
from . import views

app_name = "coding"

urlpatterns = [    
    path('coding/<int:pk>/', views.codingDetail.as_view(), name='coding_detail'),   
]
1
2
3
4
5
6
7
8
9
#myapp/coding/views.py
from django.shortcuts import render
from django.views import generic
from .models import PyCoding


class codingDetail(generic.DetailView):
    model = PyCoding
    context_object_name="pageInfo"

58.5 urls.py 맵핑 및 views.py 구현

화면에서 context_object_name(pageInfo) 객체에서 데이터를 꺼내 화면을 구성합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{% extends "base/base.html" %}
{% load static %}
{% load extr_blog %} 

{% block content %}
<div class="d-sm-flex align-items-center justify-content-between mb-4">
    <h1 id="title_text" class="h3 mb-0 text-gray-800"><span id="{{pageInfo.title}}">{{pageInfo.title}}</span></h1>     
</div>

<!-- Content Row -->
<div class="row">
    <div class="col-lg-8 mb-4">
      <!-- Illustrations -->
        <div class="card shadow mb-4">               
            <div class="card-header py-3">                
                <h2 class="m-1 font-weight-bold text-dark"><span id="{{list.sub_title}}">{{pageInfo.sub_title}}</span></h2>                 
            </div>
            <div class="card-body">
                {% if pageInfo.img_url  %}
                <div class="text-center">
                     <img class="img-fluid px-3 px-sm-4 mt-3 mb-4" style="width: {{pageInfo.img_size}}rem;" src="{{pageInfo.img_url}}" title="{{pageInfo.sub_title}}"/>
                </div>
                {% endif %}
                <!-- content1 start-->                    
                <div class="mb-2 pl-4">
                    {{ pageInfo.content_body|formatted_markdown }}
                </div>                    
            </div>                            
        </div>        
    </div>    
</div>

 <!-- END Row -->
{% endblock %}

잘 추가되서 연결되었습니다.

다음 포스팅은 이번에 만든 모델로
트리구조 메뉴를 만들어 보겠습니다.

장고앱브라우저에서확인하기