58.Django Application 추가하기
58.1 coding app 추가 하기 - startapp
python manage.py startapp 앱이름으로 어플리케이션을 생성합니다.
setting파일(base.py)을 열고
INSTALLED_APPS에 들어갈 앱이름을 입력합니다.
생성한 App은(coding) 디렉토리로 옮겼습니다.(myapp/conding)
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} 에서 왼쪽이 값, 오른쪽이 화면 표시 입니다.
get_absolute_url함수를 미리 만들고
url name은 coding_detail로 정의했습니다.
content_body는 마크다운 적용 필드 입니다. 50 장고 마크다운 설치 / 적용 하기
#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를 생성해주세요.
python manage.py makemigrations
python manage.py migrate
58.3 관리자에 모델 추가히기 - admin.py
모델을 관리자에서 글을 등록할 수 있습니다.
#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
#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'),
]
#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) 객체에서 데이터를 꺼내 화면을 구성합니다.
{% 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 %}
잘 추가되서 연결되었습니다.
다음 포스팅은 이번에 만든 모델로
트리구조 메뉴를 만들어 보겠습니다.