※ 본 가이드는 프로젝트 초기 세팅 및 프로젝트 구성 방법에 대해 다루지 않습니다. ※
project_name/
apps/
__init__.py
settings.py
urls.py
wsgi.py
books/
migrations/
templates/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
urls.py
venv/
manage.py
# books/models.py
from django.db import models
PUBLISHING_CODE = (
(1, ('Pending')),
(2, ('Accepted')),
(3, ('Canceled')),
(4, ('Rejected')),
)
class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=300)
birth_date = models.DateField(blank=True, null=True)
class Genre(models.Model):
genre_name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
status = models.SmallIntegerField(choices=PUBLISHING_CODE, default=2)
# books/admins.py
from django.contrib import admin
from books.models import Author, Genre, Book
admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Genre)
모델을 등록하는 것 만으로도 django의 기능을 통해 admin 페이지 구성이 가능합니다.
# books/admins.py
from django.contrib import admin
from books.models import Author, Genre, Book
# admin.site.register(Book)
# admin.site.register(Author)
# admin.site.register(Genre)
# 방법 1
class AuthorAdmin(admin.ModelAdmin):
pass
admin.site.register(Author, AuthorAdmin)
# 방법 2
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
pass
@admin.register(Genre)
class GenreAdmin(admin.ModelAdmin):
pass
admin.ModelAdmin를 상속받은 클래스 선언 후 admin.site.register(모델명, 클래스명)을 등록하는것과@admin.register(모델명)을 데코레이터로 등록한 클래스는 기존에 admin.site.register()를 통해 등록한것과 동일한 결과를 보여줍니다.
# books/admins.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'author', 'title', 'genre', 'status')
선언한 AuthorAdmin내에 list_display를 튜플 또는 리스트 형식으로 원하는 컬럼값을 등록해줍니다.
목록 뷰에 필요한 값을 노출시키고 싶다면 models.py에서 선언 후 사용 가능합니다.
# books/models.py
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
status = models.SmallIntegerField(choices=PUBLISHING_CODE, default=2)
def tilte_for_html(self):
return '<b>' + self.title + '</b>'
# books/admins.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'author', 'tilte_for_html', 'genre', 'status')
ForeignKey(xxx objects (1))가 보이는것 또한 변경이 가능합니다.
# books/models.py
class Author(models.Model):
name = models.CharField(max_length=100)
birth_date = models.DateField(blank=True, null=True)
def __str__(self):
return self.name
# books/admins.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'author', 'tilte_for_html', 'genre', 'status')
list_per_page = 10
list_per_page 를 통해 페이지 별 목록 개수 설정이 가능합니다.
# books/admins.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'author', 'tilte_for_html', 'genre', 'status')
readonly_fields = ('author', 'title', 'genre')
list_per_page = 10
# books/admins.py
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'author', 'tilte_for_html', 'genre', 'status')
readonly_fields = ('author', 'title', 'genre')
list_per_page = 10
fields = ['author', ('title','genre'), 'status']
fields를 선언함으로서 수정 페이지 내 순서 및 수평적 표시가 가능합니다.
settings.py에 STATIC_ROOT
설정 되어있는것을 확인하고 collectstatic 명령어를 통해 django의 정적파일을 모아줍니다.
python manage.py collectstatic
(django가 설치된 경로)/contrib/admin/templates 폴더를 내를 확인해보면 admin 폴더와 registration 폴더가 존재합니다.
두 폴더를 복사해서 settings.py에서 templates dir로 설정된 경로에 붙여넣습니다.
project_name/
apps/
__init__.py
settings.py
urls.py
wsgi.py
books/
migrations/
static/
admin/
templates/
admin/
registration/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
urls.py
venv/
manage.py
원하는 페이지의 html파일을 찾아 수정합니다.
# /templates/admin/submit_line.html
...
# line 4
{% if show_save %}<input type="submit" value="{% if original %}{{ original }}을(를) {% endif %}{% translate '저장' %}" class="default" name="_save">{% endif %}
...
# line 7
<p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% if original %}{{ original }}을(를) {% endif %}{% translate "삭제" %}</a></p>
4번줄과 7번줄은 각각 save 버튼과 delete 버튼에 해당되는 부분입니다.
해당부분을 수정하여 원하는 모양으로 변경시켜줍니다.