-
Django Admin을 활용한 프로젝트 기본 세팅카테고리 없음 2021. 11. 17. 11:33
프로젝트 목적: 이미지 캡셔닝 모델을 Django 서버 내에서 실행시킬 수 있도록 설정하여, 웹 페이지 환경에서 테스트할 수 있는 서비스 만들기
<장고를 이용한 기본 세팅 가이드>
참고 자료1 django 공식문서 : https://docs.djangoproject.com/ko/3.2/intro/
참고 자료2 github django : https://github.com/django/django/tree/main/django
참고 자료3 초보몽키(django편): https://wayhome25.github.io/django/2017/02/27/django-01-install/
New project로 가상환경이 만들어진 후, 장고 설치하기 (참고사이트: https://www.djangoproject.com/download/)
pip install django~=3.0.0 => 최신 버전으로 바로 설치
python -m pip install Pillow => 사진을 넣기위해 필요한 프로그램
project directory안에 requirements.txt 추가
- 가상환경에서 설치된 모든 프로그램을 담는 장소
- django~=3.0.0 추가
- pillow 추가
django-admin startproject <프로젝트명>
-> 장고의 기본 프로젝트 세팅
-> <프로젝트명>(__init__, asgi, settings, urls, wsgi.py), manage.py 가 생성된다.
- manage.py: 명령행을 통해 각종 장고 명령을 수행
- __init__ : 패키지를 임포트할 때의 임포트 대상
- settings: 현재 프로젝트에서 장고 기본 설정을 덮어쓰고, 새롭게 지정할 설정들. app을 새로 만들 때마다 추가해주어야 한다.
- urls: 최상위 URL 설정. app을 새로 만들 때마다 추가해야한다.
- wsgi: 실서비스에서의 웹서비스 진입점
만들어진 settings.py 하단에 다음을 추가. 정적인 파일을 관리하는 설정.
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles") STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"), ] MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR, "media")
manage.py와 동일한 디렉토리 안에 templates/layout.html 파일 만들기
- templates는 HTML을 모두 관리하는 파일. 생성할 HTML도 모두 이 파일에 넣는다.
settings.py 중간에 TEMPLATES list의 DIRS를 다음과 같이 변경.
'DIRS': [os.path.join(BASE_DIR, "templates"), ],
urls.py에서 아래를 추가
if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
위의 세팅을 완료한 후, manage.py가 들어있는 directory로 이동
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
수행을 하고, localhost:8000/admin/ 으로 이동하면 createsuperuser에서 입력했던 아이디/비번으로 들어가면 admin page 들어갈 수 있다.
========================================================================================
앱 만들기
python manage.py startapp <앱이름>
<앱이름>안에 urls.py 만들기. 그리고 urls.py안에 다음을 추가
from django.urls import path urlpatterns =[]
<프로젝트명>/settings.py/ INSTALLEDAPPS 에 새로운 앱 이름 추가
<프로젝트명>/urls.py/ 안에 새로운 경로 추가. 아마 admin은 돼 있을거고, 밑에쳐럼 url 연결해준다.
from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('aiai/', include('aiai.urls')) ]
## 새로운 app을 만들 때, 항상 해야할 것
app/ url.py 추가 => urlpatterns = [ ] 추가
project / settings.py/ INSTALLEDAPPS에 새로운 앱 이름 추가
project / urls.py 에 새로운 경로 추가
##
app / models.py
from django.db import models from django.urls import reverse class Post(models.Model): photo = models.ImageField(blank=True, upload_to="aiai/post/%Y/%m/%d") text = models.TextField(blank=True) def __str__(self): return str(self.pk)
Post라는 모델을 만든다. Field에는 여러가지가 있는데, 사진을 사용할때는 ImageField, 글을 사용할 때는 글자 제한 수가 없을 때는 TextField, 제한 수가 있을 때는 CharField를 사용한다. 기본적으로 blank=False로 되어 있는데, Ture를 사용해 값이 없어도 업로드 할 수 있도록 하였다. upload_to 는 사진 파일의 경로를 섞이지 않도록 이름을 시간으로 설정하였다.
__str__은 정의해주지 않으면 admin page 항목에 object 1,2,3,... 이렇게 뜨는데 pk로 보기 편하게 볼 수 있다.
app/ admin.py
from django.contrib import admin from django.utils.safestring import mark_safe from .models import Post @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ["photo_tag", "text"] readonly_fields = ('text', ) def photo_tag(self, post): if post.photo: return mark_safe(f'<img src="{post.photo.url}" style="width: 72px;" />') return None def save_model(self, request, obj, form, change): print(obj) print(obj.photo) obj.text = 'test text' return super().save_model(request, obj, form, change)
localhost:8000/admin 에 보일 곳을 커스텀할 수 있다.
list_display : admin page에서 보일 목록
readonly_fields : text를 작성할 수 없고 read만 할 수 있도록 설정
def photo_ tag : admin에 사진 넣을 수 있는 함수
def save_model : obj를 활용할 수 있다. 'test text' 대신에 이미지 캡셔닝 모델의 결과를 넣는다면, 사진과 결과 text 확인할 수 있다.
python manage.py makemigrations <앱이름>
python manage.py migrate <앱이름>
이를 통해 model에 적은 값들이 저장된다.
python manage.py runserver
를 통해 서버를 돌리고 admin page로 들어가면 사진과 text를 확인할 수 있다.