TIL#123 Django study(1)

Dasom·2021년 1월 9일
0

Django

목록 보기
18/34

admin 사이트에 테이블 반영

bookmark/admin.py

from django.contrib import admin
from bookmark.models import Bookmark

@admin.register(Bookmark)
class BookmarkAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'url')

BookmarkAdmin클래스는 Bookmark 클래스가 Admin 사이트에서 어떤 모습으로 출력할지를 정의하는 클래스이다. @admin.register() 데코레이터를 사용하여 어드민 사이트에 등록한다. 데코레이터 대신에 register() 함수를 사용하여 작성도 가능하다.

bookmark/admin.py

from django.contrib import admin
from bookmark.models import Bookmark

class BookmarkAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'url')

admin.site.register(Bookrmark, BookmarkAdmin)

admin 사이트 이름 표기 방식

runserver 이후에 실행된 어드민 사이트에서 로그인을 하면 장고에서 기본적으로 제공하는 user, group 테이블 이외에 새로 추가된 bookmark 테이블이 보인다. bookmark 테이블 옆의 add 버튼을 누르면 models.py에 정의한 테이블의 모습을 볼 수 있다.

  • 애플리케이션명 : 왼쪽의 BOOKMARK. startapp appname 명령 시 사용한 appname을 대문자로 표시
  • 테이블명 : 왼쪽의 BOOKMARK 아래의 Bookmarks. 객체명에 복수명 접미사(s)를 추가하고 첫 글자를 대문자로 표시. verbose_name_plural 메타 옵션으로 변경 가능
  • 객체명 : 중앙 위쪽의 Add bookmark. models.py에 정의한 모델 클래스 이름을 소문자와 공백으로 바꾼 것. verbose_name 메타 옵션으로 지정 가능

generic view - ListView, DetailView

bookmark/views.py

from django.views.generic import ListView, DetailView
from bookmark.models import Bookmark

class BookmarkListView(ListView):
    model = Bookmark
    
class BookmarkDetailView(DetailView):
    model = Bookmark
  • ListView
    레코드 리스트를 보여주기 위한 뷰이다. ListView를 상속받는 경우는 객체가 들어있는 리스트를 구성해서 이를 컨텍스트 변수로 템플릿 시스템에 넘겨주면 된다. 만일 이런 리스트를 테이블에 들어 있는 모든 레코드를 가져와 구성하는 경우에는 테이블명, 즉 모델 클래스명만 지정해주면 된다.
    명시적으로 지정하지 않아도 장고에서 디폴트로 알아서 지정해주는 속성이 2가지 있다. 1번째는 컨텍스트 변수로 object_list를 사용하는 것이고, 2번째는 템플릿 파일명을 모델명 소문자_list.html 형식의 이름으로 지정하는 것이다. 템플릿 파일명은 디폴트로 bookmark/bookmark_list.html 이 된다.
  • DetailView
    특정 레코드에 대한 상세 정보를 보여주기 위한 뷰이다. DetailView를 상속받는 경우는 특정 객체 하나를 컨텍스트 변수에 담아서 템플릿 시스템에 넘겨주면 된다. 만약 테이블에서 pk로 조회해서 특정 객체를 가져오는 경우에는 테이블명, 즉 모델 클래스명만 지정해주면 된다. 조회 시 사용할 pk값은 URLconf에서 추출해 뷰로 넘어온 인자를 사용한다.
    명시적으로 지정하지 않아도 장고에서 디폴트로 알아서 지정해주는 속성이 2가지 있다. 1번째는 컨텍스트 변수로 object를 사용하는 것이고, 두번째는 템플릿 파일명은 모델명 소문자_detail.html 형식의 이름으로 지정하는 것이다. 템플릿 파일명은 디폴트로 bookmark/bookmark_detail.html이 된다. 테이블 조회 조건에 사용되는 pk값은 URLconf에서 넘겨받는데, 이에 대한 처리는 DetailView 제네릭 뷰에서 알아서 처리해준다.

templates - str()

bookmark/models.py

class Bookmark(models.Model):
    title = models.CharField('Title', max_length=100, blank=True)
    url = models.URLField('URL', unique=True)

    def __str__(self):
        return self.title


bookmark/templates/bookmark/bookmark_list.html

...
<div id="content">
    <h1>Bookmark List</h1>
    <ul>
        {% for bookmark in object_list %}
            <li><a href="{% url 'detail' bookmark.id %}">{{ bookmark }}</a></li>
        {% endfor %}
    </ul>
</div>
...
  • {{ bookmark }} 템플릿 변수는 Bookmark 테이블의 특정 레코드 하나를 의미한다. 해당 객체를 프린트하면 해당 객체의 __str__() 메소드를 호출해서 그 결과를 출력한다. 위의 코드대로라면 객체의 title이 출력된다.

SlugField

blog/models.py

class Post(models.Model):
   ...
   slug = models.SlugField('SLUG', unique=True, allow_unicode=True, help_text='one word for title alias.')
   ...
  • allow_unicode : 옵션을 추가하면 한글 처리가 가능
  • help_text : 해당 컬럼을 설명해주는 문구로 폼 화면에 나타남. admin 사이트에서 확인 가능
  • Slug
    페이지나 포스트를 설명하는 핵심 단어의 집합이다. 원래는 신문이나 잡지 등에서 제목을 쓸 때, 중요한 의미를 포함하는 단어만 이용해 제목을 작성하는 방법을 말한다. 웹 개발 분야에서는 콘텐츠의 고유 주소로 사용되어 콘텐츠의 주소가 어떤 내용인지 쉽게 이해할 수 있도록 한다.
    보통 슬러그는 페이지나 포스트의 제목에서 조사, 전치사, 쉼표, 마침표 등을 빼고 띄어쓰기는 하이픈(-)으로 대체해서 만들며 URL에 사용된다. 슬러그를 URL에 사용함으로써 검색 엔진에서 더 빨리 페이지를 찾아주고 검색 엔진의 정확도를 높여준다.
    URL에서 pk 대신 사용되는 경우가 많다. pk를 사용하면 숫자로만 되어 있어 그 내용을 유추하기 어렵지만, 슬러그를 사용하면 보통의 단어들이라서 이해하기 쉽기 때문이다.
    SlugField의 디폴트 길이는 50이며, 해당 필드에는 인덱스가 디폴트로 생성된다.

admin 클래스 정의

blog/admin.py

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'modify_dt')
    list_filter = ('-modify_dt', )
    search_fields = ('title', 'content')
    prepopulated_fields = {'slug': ('title', )}
  • list_display : id, title, modify_dt 를 화면에 출력하라고 지정
  • list_filter : modify_dt 컬럼을 사용하는 필터 사이드바를 보여주도록 지정
  • search_fields : 검색박스를 표시하고, 입력된 단어는 title과 content 컬럼에서 검색하도록 한다
  • prepopulated_fields : 슬러그 필드는 타이틀 필드를 사용해 미리 채워지도록 한다
profile
개발자꿈나무🌲

0개의 댓글