ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 에 새로운 앱 이름 추가

    내 앱이름은 aiai

    <프로젝트명>/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를 확인할 수 있다. 

Designed by Tistory.