순서
1.Django 설치
2.Model을 adminsite에 등록하기
3.기본적인 사용법
4.조금 더 심화된 사용법
5.커스텀 페이지 추가
6.UI 변경하기
7.Admin site 분리하기
8.마지막으로 (간단한) 문서화!
12.
예제를 위한 모델
MEMBER
name이름
email 이메일
permission 권한
certification_date 인증일
is_certificated 인증상태
POST
member 작성자
category 카테고리
title 제목
subtitle 부제목
content 내용
is_deleted 삭제여부
created_at 작성일
COMMENT
member 작성자
post 원글
content 내용
report_count 신고수
created_at 작성일
CATEGORY
name 이름
* permission (관리자, 에디터, 일반)
예제를 위한 모델- Post
class Category(models.Model):
name = models.CharField('카테고리 이름', max_length=20)
class Post(models.Model):
member = models.ForeignKey(Member, verbose_name='작성자')
category = models.ForeignKey(Category, verbose_name='카테고리')
title = models.CharField('제목', max_length=255)
content = models.TextField('내용')
is_deleted = models.BooleanField('삭제된 글', default=False)
created_at = models.DateTimeField('작성일', auto_now_add=True)
class Comment(models.Model):
member = models.ForeignKey(Member, verbose_name='작성자')
post = models.ForeignKey(Post, verbose_name=‘원본글’)
content = models.TextField()
is_blocked = models.BooleanField('노출 제한', default=False)
15.
순서
1.Django 설치
2.Model을 adminsite에 등록하기
3.기본적인 사용법
4.조금 더 심화된 사용법
5.커스텀 페이지 추가
6.UI 변경하기
7.Admin site 분리하기
8.마지막으로 (간단한) 문서화!
16.
Django 설치
example $pyenv virtualenv 3.6.2 pyconExample # 가상 환경 추가
example $ pyenv shell envExample # 가상 환경 실행
(envExample) example $ pip install django # django 설치
(envExample) example $ django-admin.py startproject example # django 프로젝트 생성
(envExample) example $ python manage.py startapp member # member, post 앱 추가
(envExample) example $ python manage.py startapp post
(envExample) example $ python manage.py createsuperuser # 관리자 추가
(envExample) example $ python manage.py runserver # 실행
http://localhost:8000 http://localhost:8000/admin/
17.
순서
1.Django 설치
2.Model을 adminsite에 등록하기
3.기본적인 사용법
4.조금 더 심화된 사용법
5.커스텀 페이지 추가
6.UI 변경하기
7.Admin site 분리하기
8.마지막으로 (간단한) 문서화!
18.
Model을 admin site에등록
# member/admin.py
from django.contrib import admin
from member.models import Member
admin.site.register(Member)
# post/amdin.py
from django.contrib import admin
from post.models import Category, Post, Comment
admin.site.register(Post)
admin.site.register(Category)
admin.site.register(Comment)
19.
Model을 admin site에등록
# post/models.py
class Category(models.Model):
class Meta:
verbose_name_plural = "categories"
name = models.CharField(max_length=20)
20.
순서
1.Django 설치
2.Model을 adminsite에 등록하기
3.기본적인 사용법
4.조금 더 심화된 사용법
5.커스텀 페이지 추가
6.UI 변경하기
7.Admin site 분리하기
8.마지막으로 (간단한) 문서화!
21.
기본 - List
#member/admin.py
class MemberAdmin(admin.ModelAdmin):
22.
기본 - List
#member/admin.py
class MemberAdmin(admin.ModelAdmin):
list_per_page = 5
23.
기본 - List
#member/admin.py
class MemberAdmin(admin.ModelAdmin):
list_per_page = 5
list_display = (
'id', 'email', ‘username',
'permission', ‘is_certificated',
‘certification_date’, ‘post_count', )
24.
기본 - List
#member/admin.py
class MemberAdmin(admin.ModelAdmin):
list_per_page = 5
list_display = (
'id', 'email', ‘username',
'permission', ‘is_certificated',
‘certification_date’, ‘post_count', )
list_editable = ('permission', )
25.
기본 - List
#member/admin.py
class MemberAdmin(admin.ModelAdmin):
list_per_page = 5
list_display = (
'id', 'email', ‘username',
'permission', ‘is_certificated',
‘certification_date’, ‘post_count', )
list_editable = ('permission', )
list_filter = ('permission', )
기본 - CustomValidation
# post/forms.py
class MyPostAdminForm(forms.ModelForm):
def clean_content(self): # clean_{field_name}
ModelForm Documentation
https://docs.djangoproject.com/en/1.11/topics/forms/modelforms
33.
기본 - CustomValidation
# post/forms.py
class MyPostAdminForm(forms.ModelForm):
def clean_content(self): # clean_{field_name}
content = self.cleaned_data['content']
words = ['심심하다', ‘관리자’, ‘금지어’, ]
error_message =
'[{0}] {1}'.format(', '.join(words), ‘와…’)
if any(word in content for word in words):
raise forms.ValidationError(error_message)
return content
ModelForm Documentation
https://docs.djangoproject.com/en/1.11/topics/forms/modelforms
34.
기본 - CustomValidation
# post/forms.py
class MyPostAdminForm(forms.ModelForm):
def clean_content(self): # clean_{field_name}
content = self.cleaned_data['content']
words = ['심심하다', ‘관리자’, ‘금지어’, ]
error_message =
'[{0}] {1}'.format(', '.join(words), ‘와…’)
if any(word in content for word in words):
raise forms.ValidationError(error_message)
return content
# post/admin.py
class PostAdmin(admin.ModelAdmin):
form = MyPostAdminForm
. . .
ModelForm Documentation
https://docs.djangoproject.com/en/1.11/topics/forms/modelforms
35.
기본 - CustomValidation
# post/forms.py
class MyPostAdminForm(forms.ModelForm):
def clean_content(self): # clean_{field_name}
content = self.cleaned_data['content']
words = ['심심하다', ‘관리자’, ‘금지어’, ]
error_message =
'[{0}] {1}'.format(', '.join(words), ‘와…’)
if any(word in content for word in words):
raise forms.ValidationError(error_message)
return content
# post/admin.py
class PostAdmin(admin.ModelAdmin):
form = MyPostAdminForm
. . .
ModelForm Documentation
https://docs.djangoproject.com/en/1.11/topics/forms/modelforms
[심심하다, 관리자, 금지어]와 같은 단어들은 입력하실 수 없습니다.
36.
순서
1.Django 설치
2.Model을 adminsite에 등록하기
3.기본적인 사용법
4.조금 더 심화된 사용법
5.커스텀 페이지 추가
6.UI 변경하기
7.Admin site 분리하기
8.마지막으로 (간단한) 문서화!
37.
심화 - Customlist filter
# post/filters.py
class CreatedDateFilter(admin.SimpleListFilter):
title = '작성일'
parameter_name = 'date'
def lookups(self, request, model_admin):
results = []
for i in range(-3, 6):
date = datetime.date.today() + datetime.timedelta(days=i)
display_str = '{0} [{1}개]'.format(
date,
Post.objects.filter(created_at__date=date).count()
)
display_str += ' - 오늘' if i == 0 else ''
results.append((date, display_str))
return results
def queryset(self, request, queryset):
if self.value():
return queryset.filter(created_at__date=self.value())
else:
return queryset.all()
38.
심화 - Customlist filter
# post/filters.py
class CreatedDateFilter(admin.SimpleListFilter):
title = '작성일'
parameter_name = 'date'
def lookups(self, request, model_admin):
results = []
for i in range(-3, 6):
date = datetime.date.today() + datetime.timedelta(days=i)
display_str = '{0} [{1}개]'.format(
date,
Post.objects.filter(created_at__date=date).count()
)
display_str += ' - 오늘' if i == 0 else ''
results.append((date, display_str))
return results
def queryset(self, request, queryset):
if self.value():
return queryset.filter(created_at__date=self.value())
else:
return queryset.all()
39.
심화 - Customlist filter
# post/filters.py
class CreatedDateFilter(admin.SimpleListFilter):
title = '작성일'
parameter_name = 'date'
def lookups(self, request, model_admin):
results = []
for i in range(-3, 6):
date = datetime.date.today() + datetime.timedelta(days=i)
display_str = '{0} [{1}개]'.format(
date,
Post.objects.filter(created_at__date=date).count()
)
display_str += ' - 오늘' if i == 0 else ''
results.append((date, display_str))
return results
def queryset(self, request, queryset):
if self.value():
return queryset.filter(created_at__date=self.value())
else:
return queryset.all()
40.
심화 - Customaction
# member/admin.py
from member.forms import SetCertificationDateForm
class MemberAdmin(admin.ModelAdmin):
actions = ['set_certification_date']
action_form = SetCertificationDateForm # SelectDateWidget
41.
심화 - Customaction
# member/admin.py
from member.forms import SetCertificationDateForm
class MemberAdmin(admin.ModelAdmin):
actions = ['set_certification_date']
action_form = SetCertificationDateForm # SelectDateWidget
def set_certification_date(self, request, queryset):
year, month, day = . . . # POST Request에서 값을 꺼냄
if year and month and day:
date_str = '{0}-{1}-{2}'.format(year, month, day)
date = strptime(date_str, "%Y-%d-%m").date()
for member in queryset:
Member.objects
.filter(id=member.id)
.update(is_certificated=True, certification_date=date)
messages.success(request, '{0}명의 회원을 인증했습니다.'.format(len(queryset)))
else:
messages.error(request, '날짜가 선택되지 않았습니다.')
42.
심화 - Customaction
# member/admin.py
from member.forms import SetCertificationDateForm
class MemberAdmin(admin.ModelAdmin):
actions = ['set_certification_date']
action_form = SetCertificationDateForm # SelectDateWidget
def set_certification_date(self, request, queryset):
year, month, day = . . . # POST Request에서 값을 꺼냄
if year and month and day:
date_str = '{0}-{1}-{2}'.format(year, month, day)
date = strptime(date_str, "%Y-%d-%m").date()
for member in queryset:
Member.objects
.filter(id=member.id)
.update(is_certificated=True, certification_date=date)
messages.success(request, '{0}명의 회원을 인증했습니다.'.format(len(queryset)))
else:
messages.error(request, '날짜가 선택되지 않았습니다.')
set_certification_date.short_description = '선택된 유저를 해당 날짜 기준으로 인증합니다.'
43.
순서
1.Django 설치
2.Model을 adminsite에 등록하기
3.기본적인 사용법
4.조금 더 심화된 사용법
5.커스텀 페이지 추가
6.UI 변경하기
7.Admin site 분리하기
8.마지막으로 (간단한) 문서화!
문서화
# post/models.py
class Comment(models.Model):
"""
사용들이작성한 글에 대한 댓글입니다.
댓글은 :model:`post.Post` 와 :model:`member.Member`. 모델과 1:N 관계입니다.
"""
member = models.ForeignKey(Member, verbose_name='작성자')
post = models.ForeignKey(Post, verbose_name='원본글')
content = models.TextField(verbose_name='내용', help_text='댓글 내용입니다.')
67.
• 시간이 길지않아, 준비한 내용은 여기까지입니다.
• 이 외에도 공식 문서에 추가적인 커스텀 방법들이 소개되어 있습니다.
• 예제 코드는 아래에서 확인하실 수 있습니다.
https://github.com/bbayoung/django-admin-site-custom-example
감사합니다.