xadmin 기반 백엔드 관리 설정
먼저 pip를 사용하여 xadmin 및 관련 의존성 패키지를 설치합니다.
pip install django-adminx
설치完成后 xadmin을 제거하고, 관련 의존성 패키지는 유지합니다.
pip uninstall django-adminx
소스코드 수정이 필요합니다. xadmin 소스를 직접 다운로드 받으세요.
https://github.com/sshwsfc/xadmin/tree/django2
프로젝트 루트 디렉토리에 Python Package "extra_apps"를 생성하고, 다운로드한 xadmin 폴더를 해당 디렉토리에 배치합니다. 디렉토리 구조는 다음과 같습니다:
extra_apps를 시스템 경로에 추가합니다.
# settings.py
sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps'))
URL 라우팅을 설정합니다.
from django.urls import path
from extra_apps import xadmin
urlpatterns = [
path('admin/', xadmin.site.urls),
]
INSTALLED_APPS에 xadmin을 추가합니다.
'xadmin',
'crispy_forms',
데이터베이스 마이그레이션을 실행합니다.
python manage.py makemigrations
python manage.py migrate
관리자 계정을 생성합니다.
python manage.py createsuperuser
서버를 실행하고 http://127.0.0.1:8000/admin에 접근합니다.
생성한 아이디와 비밀번호로 로그인하면 백엔드 관리 시스템에 진입할 수 있습니다.
백엔드 관리 기능 확장
생성한 네 개의 앱 디렉토리 각각에 adminx.py 파일을 새로 생성합니다. 이 파일에는 백엔드 관리 관련 설정이 저장되며, admin.py와 유사한 작성 방식과 기능을 갖습니다.
course/adminx.py
# course/adminx.py
import xadmin
from .models import Course, Lesson, Video, CourseResource
class CourseAdmin(object):
'''강좌'''
list_display = [ 'name','desc','detail','degree','learn_times','students']
search_fields = ['name', 'desc', 'detail', 'degree', 'students']
list_filter = [ 'name','desc','detail','degree','learn_times','students']
class LessonAdmin(object):
'''챕터'''
list_display = ['course', 'name', 'add_time']
search_fields = ['course', 'name']
list_filter = ['course__name', 'name', 'add_time']
class VideoAdmin(object):
'''비디오'''
list_display = ['lesson', 'name', 'add_time']
search_fields = ['lesson', 'name']
list_filter = ['lesson', 'name', 'add_time']
class CourseResourceAdmin(object):
'''강좌 리소스'''
list_display = ['course', 'name', 'download', 'add_time']
search_fields = ['course', 'name', 'download']
list_filter = ['course__name', 'name', 'download', 'add_time']
xadmin.site.register(Course, CourseAdmin)
xadmin.site.register(Lesson, LessonAdmin)
xadmin.site.register(Video, VideoAdmin)
xadmin.site.register(CourseResource, CourseResourceAdmin)
operation/adminx.py
# operation/adminx.py
import xadmin
from .models import UserAsk, UserCourse, UserMessage, CourseComments, UserFavorite
class UserAskAdmin(object):
'''사용자 교육 신청'''
list_display = ['name', 'mobile', 'course_name', 'add_time']
search_fields = ['name', 'mobile', 'course_name']
list_filter = ['name', 'mobile', 'course_name', 'add_time']
class UserCourseAdmin(object):
'''사용자 강좌 학습'''
list_display = ['user', 'course', 'add_time']
search_fields = ['user', 'course']
list_filter = ['user', 'course', 'add_time']
class UserMessageAdmin(object):
'''사용자 메시지'''
list_display = ['user', 'message', 'has_read', 'add_time']
search_fields = ['user', 'message', 'has_read']
list_filter = ['user', 'message', 'has_read', 'add_time']
class CourseCommentsAdmin(object):
'''사용자 후기'''
list_display = ['user', 'course', 'comments', 'add_time']
search_fields = ['user', 'course', 'comments']
list_filter = ['user', 'course', 'comments', 'add_time']
class UserFavoriteAdmin(object):
'''사용자 북마크'''
list_display = ['user', 'fav_id', 'fav_type', 'add_time']
search_fields = ['user', 'fav_id', 'fav_type']
list_filter = ['user', 'fav_id', 'fav_type', 'add_time']
xadmin.site.register(UserAsk, UserAskAdmin)
xadmin.site.register(UserCourse, UserCourseAdmin)
xadmin.site.register(UserMessage, UserMessageAdmin)
xadmin.site.register(CourseComments, CourseCommentsAdmin)
xadmin.site.register(UserFavorite, UserFavoriteAdmin)
organization/adminx.py
# organization/adminx.py
import xadmin
from .models import CityDict, CourseOrg, Teacher
class CityDictAdmin(object):
'''도시'''
list_display = ['name', 'desc', 'add_time']
search_fields = ['name', 'desc']
list_filter = ['name', 'desc', 'add_time']
class CourseOrgAdmin(object):
'''기관'''
list_display = ['name', 'desc', 'click_nums', 'fav_nums','add_time' ]
search_fields = ['name', 'desc', 'click_nums', 'fav_nums']
list_filter = ['name', 'desc', 'click_nums', 'fav_nums','city__name','address','add_time']
class TeacherAdmin(object):
'''강사'''
list_display = [ 'name','org', 'work_years', 'work_company','add_time']
search_fields = ['org', 'name', 'work_years', 'work_company']
list_filter = ['org__name', 'name', 'work_years', 'work_company','click_nums', 'fav_nums', 'add_time']
xadmin.site.register(CityDict, CityDictAdmin)
xadmin.site.register(CourseOrg, CourseOrgAdmin)
xadmin.site.register(Teacher, TeacherAdmin)
users/adminx.py
# users/adminx.py
import xadmin
from .models import EmailVerifyRecord,Banner
class EmailVerifyRecordAdmin(object):
list_display = ['code', 'email', 'send_type', 'send_time']
search_fields = ['code', 'email', 'send_type']
list_filter = ['code', 'email', 'send_type', 'send_time']
class BannerAdmin(object):
list_display = ['title', 'image', 'url','index', 'add_time']
search_fields = ['title', 'image', 'url','index']
list_filter = ['title', 'image', 'url','index', 'add_time']
xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)
xadmin.site.register(Banner,BannerAdmin)
xadmin CSV 내보내기 한글 깨짐 문제
UTF-8 인코딩을 GBK로 변경하면 해결됩니다(xadmin/plugins/export.py 파일 수정).
xadmin 전역 설정
사이트 전체 설정은 users\adminx.py에 추가합니다.
from xadmin import views
class BaseSetting(object):
enable_themes = True
use_bootswatch = True
xadmin.site.register(views.BaseAdminView, BaseSetting)
class GlobalSettings(object):
site_title = "교육 플랫폼 관리자"
site_footer = "eduplatform"
menu_style = "accordion"
xadmin.site.register(views.CommAdminView, GlobalSettings)
왼쪽 메뉴 영어를 한글로 변경
각 앱의 apps.py 파일을 수정합니다.
# users/apps.py
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
verbose_name = '사용자 정보'
__init__.py 파일을 수정합니다.
default_app_config = 'users.apps.UsersConfig'
나머지 세 개의 앱 भी 동일한 방식으로 수정합니다.
메뉴 순서 커스텀
class GlobalSettings(object):
site_title = "교육 플랫폼 관리자"
site_footer = "eduplatform"
menu_style = "accordion"
def get_site_menu(self):
return (
{'title': '강좌 관리', 'menus': (
{'title': '강좌 정보', 'url': self.get_model_url(Course, 'changelist')},
{'title': '챕터 정보', 'url': self.get_model_url(Lesson, 'changelist')},
{'title': '비디오 정보', 'url': self.get_model_url(Video, 'changelist')},
{'title': '강좌 리소스', 'url': self.get_model_url(CourseResource, 'changelist')},
{'title': '강좌 후기', 'url': self.get_model_url(CourseComments, 'changelist')},
)},
{'title': '기관 관리', 'menus': (
{'title': '소속 도시', 'url': self.get_model_url(CityDict, 'changelist')},
{'title': '기관 강사', 'url': self.get_model_url(Teacher, 'changelist')},
{'title': '기관 정보', 'url': self.get_model_url(CourseOrg, 'changelist')},
)},
{'title': '사용자 관리', 'menus': (
{'title': '사용자 정보', 'url': self.get_model_url(UserProfile, 'changelist')},
{'title': '사용자 인증', 'url': self.get_model_url(EmailVerifyRecord, 'changelist')},
{'title': '사용자 강좌', 'url': self.get_model_url(UserCourse, 'changelist')},
{'title': '사용자 북마크', 'url': self.get_model_url(UserFavorite, 'changelist')},
{'title': '사용자 메시지', 'url': self.get_model_url(UserMessage, 'changelist')},
)},
{'title': '시스템 관리', 'menus': (
{'title': '사용자 문의', 'url': self.get_model_url(UserAsk, 'changelist')},
{'title': '메인 배너', 'url': self.get_model_url(Banner, 'changelist')},
{'title': '사용자 그룹', 'url': self.get_model_url(Group, 'changelist')},
{'title': '사용자 권한', 'url': self.get_model_url(Permission, 'changelist')},
{'title': '로그 기록', 'url': self.get_model_url(Log, 'changelist')},
)},)