adminLTE books 메뉴 추가, 프로젝트 첫페이지 추가 - 장고 day4

POOHYA·2021년 12월 10일
0

Django

목록 보기
2/7

adminLTE에 books 애플리케이션 추가

1. 애플리케이션 설계

2. 애플리케이션 추가

  • 애플리케이션 생성 명령어

    C:\dev\workspace\django1\ch5Lab>python manage.py startapp books

  • mysite/settings.py 파일에 books 애프리케이션 등록

#[ch5Lab/mysite/settings.py]
...(생략)...
INSTALLED_APPS = [
	'django.contrib.admin',
	'django.contrib.auth',
	'django.contrib.contenttypes',
	'django.contrib.sessions',
	'django.contrib.messages',
	'django.contrib.staticfiles',
	'polls.apps.PollsConfig', # 추가
	'books.apps.BooksConfig', # 추가
]
..(생략)...

3. 애플리케이션 – Model 코딩하기

# [ch5Lab/books/models.py]
from django.db import models


class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField('Author')
    publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
    publication_date = models.DateField()

    def __str__(self):
        return self.title


class Author(models.Model):
    name = models.CharField(max_length=50)
    salutation = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name


class Publisher(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    website = models.URLField()

    def __str__(self):
        return self.name
# [ch5Lab/books/admin.py]
from django.contrib import admin
from books.models import Book, Author, Publisher

admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Publisher)
  • 방금 작성한 테이블을 DB에 반영

    D:\dev\workspace\django1\ch5Lab>python manage.py makemigrations
    D:\dev\workspace\django1\ch5Lab>python manage.py migrate

4. URLconf 코딩하기

# [ch5Lab/mysite/urls.py]
from django.contrib import admin
from django.urls import path, include
from mysite import views # 추가

urlpatterns = [
	path('admin/', admin.site.urls),
	path('', views.HomeView.as_view(), name='home'), # 추가
	path('polls/', include('polls.urls')),
	path('books/', include('books.urls')),
]
# [ch5Lab/books/urls.py]
from django.urls import path
from . import views

app_name = 'books'
urlpatterns = [
    # /books/
    path('', views.BooksModelView.as_view(), name='index'),

    # /books/book/
    path('book/', views.BookList.as_view(), name='book_list'),

    # /books/author/
    path('author/', views.AuthorList.as_view(), name='author_list'),

    # /books/publisher/
    path('publisher/', views.PublisherList.as_view(), name='publisher_list'),

    # /books/book/99/
    path('book/<int:pk>/', views.BookDetail.as_view(), name='book_detail'),

    # /books/author/99/
    path('author/<int:pk>/', views.AuthorDetail.as_view(), name='author_detail'),

    # /books/publisher/99/
    path('publisher/<int:pk>/', views.PublisherDetail.as_view(), name='publisher_detail'),
]

5. 클래스형 View 코딩하기

# [ch5Lab/books/views.py]
from django.views.generic.base import TemplateView
from django.views.generic import ListView
from django.views.generic import DetailView
from books.models import Book, Author, Publisher

#--- TemplateView
# 특별한 로직이 없고 템플릿 파일을 랜더링하는 경우 TemplateView 제네릭 뷰를 상속받아 사용하면 간단하다
class BooksModelView(TemplateView):
    template_name = 'books/index.html'

    def get_context_data(self, **kwargs):
    	# get_context_data() 메소드를 정의할 때는 반드시 첫 줄에 super() 메소드를 호출해야 한다.
        context = super().get_context_data(**kwargs)
        # books 애플리케이션의 첫 화면에 테이블 리스트를 보여주기 위해 컨텍스트 변수model_list에 담아서 템플릿 시스템에 넘겨주고 있다.
        context['model_list'] = ['Book', 'Author', 'Publisher']
        return context

#--- ListView
#   Book 테이블로부터 모든 레코드를 가져와 object_list라는 컨텍스트 변수를 구성한다.
#   템플렛 파일은 디폴트로 books/book_list.html 파일이 된다.
class BookList(ListView):
    model = Book

class AuthorList(ListView):
    model = Author

class PublisherList(ListView):
    model = Publisher

#--- DetailView
class BookDetail(DetailView):
    model = Book

class AuthorDetail(DetailView):
    model = Author

class PublisherDetail(DetailView):
    model = Publisher

5. Template 코딩하기

github참고...생략

6. Template 상속 기능 추가

# [ch5Lab/templates/base.html]
<!DOCTYPE html>
<html lang="en">
<head>
	{% load static %}
	<link rel="stylesheet" href="{% static 'admin/css/base.css' %}" />
	<title>{% block title %}My Amazing Site{% endblock %}</title>
</head>
<body>
	<div id="sidebar">
		{% block sidebar %}
		<ul>
			<li><a href="/">Project_Home</a></li>
			<li><a href="/admin/">Admin</a></li>
		</ul>
		{% endblock %}
		<br>
	</div>
 
	<div id="content">
		{% block content %}{% endblock %}
	</div>
</body>
</html>

프로젝트 첫페이지 추가하기

  • 루트(/)url로 접속했을때 polls화면이 나오게 해보자

1. 뷰 흐름 설계

2. URLconf 코딩하기

  • 프로젝트에 대한 URL이므로 mysite/urls.py 파일에 루트(/) URL 및 임포트 문장, 두 줄만 추가하면 된다.
# [ch5Lab/mysite/urls.py]
from django.contrib import admin
from django.urls import path, include
from mysite import views	# 추가

urlpatterns = [
	path('admin/', admin.site.urls),
	path('', views.HomeView.as_view(), name='home'),	# 추가
	path('polls/', include('polls.urls')),
	path('books/', include('books.urls')),
]

3. View 코딩하기

  • 뷰 이름은 앞에서 URLconf를 코딩하면서 HomeView라고 정의하였다. 파일의 위치는 애플리케이션이 아니라 프로젝트와 관련된 뷰이므로, mysite/views.py 파일에 코딩하는 것이 적절하다.
[ch5Lab/mysite/views.py]
from django import apps
from django.views.generic.base import TemplateView
from django.apps import apps  # 추가

#--- TemplateView
class HomeView(TemplateView):

    template_name = 'home.html'

    # get_context_data() 메소드를 정의할 때는 반드시 첫 줄에 super() 메소드를 호출해야 한다.
    def get_context_data(self, **kwargs): 
	context = super().get_context_data(**kwargs)
	# mysite 프로젝트 하위에 있는 애플리케이션들의 리스트를 보여주기 위해 컨텍스트 변수 app_list에 담아서 템플릿 시스템에 넘겨준다.
	context['app_list'] = ['polls', 'books']
	return context

4. Template 코딩하기

  • ome.html 템플릿은 개별 애플리케이션 템플릿이 아니라 프로젝트 템플릿이므로, 상속에 사용하는 부모 템플릿의 위치와 동일하게 'ch05Lab/templates/' 디렉토리에 생성한다.
{% extends "base.html" %}

{% block content %}
    <h2>shkim Django Applications</h2>
    <ul>
    	# 뷰로부터 app_list 컨텍스트 변수를 전달받아서 app_list에 들어있는 애플리케이션명(appname)들을 하나씩 순회하면서 화면에 보여준다.
        {% for appname in app_list %}
# add 템플릿 필터를 사용하여 애플리케이션명에 필요한 문자열을 붙여주고 있다. 예)애플리케이션명이 'books'라면 urlvar는 'books:index'가 된다.
{% with appname|add:":"|add:"index" as urlvar %}
            <li><a href="{% url urlvar %}">{{ appname }}</a></li>
{% endwith %}
        {% endfor %}
    </ul>
{% endblock content %}

~~apps.py 관련 수업 조금 진행하였는데 이해 못 함 책 다시볼것~~

함수형 뷰와 클래스형 뷰의 장단점 공부필요 클래스형이 재사용에 좋다는데... 둘 차이점 확실하게 알아두기

실습중인 adminLTE의 polls페이지가 함수형을 되어있는데 연습 겸 클래스형으로 바꾸기 도전해볼기

profile
김효주

0개의 댓글