글

라벨이 django인 게시물 표시

django admin 에 action 추가하기

django admin에서 데이터를 삭제하는 기능밖에 없는데,  다른 추가기능을 하고 싶으면 actions에 기능을 추가한다. admin 필드에 함수를 생성하고 아래와 같이 actions 목록에 추가한다. 함수에는 modeladmin, request, queryset 파라미터가 들어간다. queryset에 모델에 대한 쿼리셋 결과가 들어간다. 아래 코드는 수정하는 모델에 필드값을 U로 업데이트하는 내용이다. short_description 에는 admin에서 콤보목록에 보이는 값을 설정한다. def make_used(modeladmin, request, queryset):     queryset.update(use_flag='U') make_used.short_description = "Make seller's user_flag = USE" @admin.register(Seller) class SellerAdmin(admin.ModelAdmin):     list_display = ['trade_code', 'trade_name', 'use_flag',                     'email', 'createdby', 'updatedby', 'username', ]     actions = [make_used]

django admin 에서 query절 변경하기

admin 을 작성할때 특정한 데이터만 보고 싶거나 쿼리를 수정하고 싶을 때가 있다.  예를 들면 로그인 사용자가 등록한 데이터만 조회를 하고 싶을 때가 있는데 이럴 때는 get_queryset 함수를 재정의하면 된다. get_queryset에는 request 파라미터만 들어간다.  부모의 쿼리셋을 받은 다음 qs.filter를 통해서 조건을 추가하면 된다.  샘플 코드는 아래와 같다. 추가로 하나더 모델정보를 저장할때 필드의 값을 모두 채워서 저장을 하는데 마찬가지로 특정값은 기본값으로 지정하고 싶을 때 save_model 을 재정의한다. 데이터 모델은 obj 변수에 값을 지정하고 save() 함수를 호출하면 된다.  @admin.register(Item) class ItemAdmin(admin.ModelAdmin):     list_display = ['id', 'seller', 'item_code', 'item_name', 'price', ]     readonly_fields = ('seller',)     def get_queryset(self, request):         qs = super(ItemAdmin, self).get_queryset(request)         if request.user.is_superuser:             return qs         return qs.filter(seller__username=request.user)     def save_model(self, request, obj, form, change):         seller = Seller.object...

django에서 i18n 지원 방법

django에서 i18n 지원 방법 django 프로젝트 공식 문서를 참고하자. https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#how-django-discovers-language-preference i18n을 사용하려면 gettext를 설치해야 하는데 윈도우 용은 아래 링크를 클릭해서 설치를 한다. http://mlocati.github.io/gettext-iconv-windows/ settings.py 에서 MIDDLEWARE_CLASSES 에 django.middleware.locale.LocaleMiddleware 를 추가한다. MIDDLEWARE_CLASSES = [ ...     'django.middleware.locale.LocaleMiddleware',     'django.middleware.common.CommonMiddleware', ... ] ugettext_lazy 를 함수를 import한다. from django.utils.translation import ugettext_lazy as _ 언어설정 LANGUAGE_CODE = 'ko-KR' 언어목록 LANGUAGES = [   ('ko', _('Korean')),   ('en', _('English')), ] 언어 파일 경로 LOCALE_PATHS = (     os.path.join(BASE_DIR, 'locale'), ) settings.py에서 위와 같이 설정 후, python manage.py makemessages 명령을 내리면 언어파일 경로에 각 언어별로 폴더가 생성된다. django.po 파일이 생성되면 파일을 열어서 수정한다. msgid에는 소스에 있는 문구가 들어있고 msgstr에 ...

django 에서 404, 500 에러 처리하기

django 에서 404, 500에러가 발생시 Debug=True로 하면 웹서버의 정보가 보이는데 실서버에 이관시에는 DEBUG=False로 해야 한다. 그런데 에러가 발생시 서버에서 발생하는 에러 페이지를 보여주기 때문에 우리가 만든 웹페이지를 보여주기 위해서는 아래와 같이 handler를 등록해주면 내가 보여주고 싶은 페이지를 볼 수 있다. 아래와 같이 설정을 한다. setting.py DEBUG = False urls 파일에서 view를 만들고 보여줄 페이지 뷰를 설정한다. urls.py handler404 = 'kid.views.page_not_found_view' handler500 = 'kid.views.page_not_found_view' views 파일에서 html를 render한다. views.py def page_not_found_view(request):     return render(request,'page_not_found.html',RequestContext(request))

django 에서 static file이 나오지 않을때

django 에서 static file이 나오지 않을때 아래와 같이 설정하면 된다. wsgi.py 를 반드시 설정하자. https://devcenter.heroku.com/articles/django-assets Django settings for static assets can be a bit difficult to configure and debug. However, if you just add the following settings to your  settings.py , everything should work exactly as expected: settings.py # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.7/howto/static-files/ BASE_DIR = os.path.dirname(os.path.abspath(__file__)) STATIC_ROOT = ' staticfiles ' STATIC_URL = ' /static/ ' STATICFILES_DIRS = ( os.path.join(BASE_DIR, ' static ' ), ) Django won’t automatically create the target directory that  collectstatic  uses, so we recommend adding a dummy file to your repository,  as seen here . Whitenoise By default, Django does not support serving static files in production. We recommend using the WhiteNoise  project for best-practice serving of static assets in production. Inst...

heroku 에서 테이블 변경시 문제점

헤로쿠에서 테이블 필드를 늘렸는데 필드가 자동으로 늘어나지 않아 각 app 마다 makemigration을 했더니 기존에 생성된 테이블이 있어 생성이 되지 않았다. 헤로쿠에서 DB 를 연결한다음 모든 app의 모델들을 삭제해야만 하였다. 별도로 필드를 늘리게 되면 테이블 수정될때마다 계속 db 업데이트문을 사용해야 될것 같아서 makemigrations 방법을 계속 사용할 수 있게 처음부터 다시 시작하였다.  아직 postgre에 익숙하지 않아서 그런걸수도 있고 django에서 마이그레이션이 익숙하지 않아서 그런것 같기도 하다. 테이블에 데이터가 많이 쌓였을때는 어떻게 해야할지 난감한데 처음부터 app 별로 마이그레이션을 해두고 작업하는게 에러를 덜 발생시킬것 같다. DB 접속 방법 heroku pg:psql --app song-diary DATABASE 테이블 삭제방법 drop table bookmarks_invitation cascade; DB 끊고 나오는 방법 \q

django 1.8 버전에서 postgre 에 User를 만들수 없는 경우

django 1.8 이상 버전에서 migrate를 하면 auth_user 를 만들수 없다는 에러가 발생한다. migrate auth를 먼저하고 나머지 migrate를 하면 정상적으로 수행된다. django.db.utils.ProgrammingError: relation "auth_user" does not exist shsong97:~/workspace (master) $ heroku run python manage.py migrate auth Running python manage.py migrate auth on song-diary... up, run.7356 Operations to perform:   Apply all migrations: auth Running migrations:   Rendering model states... DONE   Applying contenttypes.0001_initial... OK   Applying contenttypes.0002_remove_content_type_name... OK   Applying auth.0001_initial... OK   Applying auth.0002_alter_permission_name_max_length... OK   Applying auth.0003_alter_user_email_max_length... OK   Applying auth.0004_alter_user_username_opts... OK   Applying auth.0005_alter_user_last_login_null... OK   Applying auth.0006_require_contenttypes_0002... OK shsong97:~/workspace (master) $ heroku run python manage.py migrate Running python manage.py mi...

[uscript] 9장. 조회 화면 만들기

조회 화면을 가장 마지막에 한 것은 기능이 가장 복잡해서이다. 원래는 처음에 간략히 조회하는 기능을 구현하고 뒤에서 개선하는 방향으로 작성하려고 했는데 이미 만들어진 소스를 가지고 하다보니 가장 나중에 넣게 되었다. 조회 기능은 1. 페이지 기능 2. 검색기능이 들어간다. URL엔 root 에서 search_page 함수를 호출하기로 정의하였다. url(r'^$', views.search_page, name='index'), from django.core.paginator import Paginator from django.db.models import Q ITEMS_PER_PAGE = 10 PAGE_GROUP = 10 def search_page(request): scripts = [] query_type = 'title' if request.POST.has_key('query_type'): query_type = request.POST['query_type'] query = "" if request.POST.has_key('query'): query = request.POST['query'].strip() if query: keywords = query.split() q = Q() for keyword in keywords: if query_type == 'title': q = q & Q(title__icontains=keyword) elif query_type == 'contents': q = q & Q(...

[uscript] 8장. file upload/download 구현

다운로드와 업로드 구현은 request, response 객체에 정보를 읽거나 넣어주면 구현이 가능하다. 다운로드 구현은 아래와 같이 스크립트의 객체를 얻어와 본문에 있는 내용을 한글로 인코딩하여 첨부 파일 형태로 다운로드 되게 하였다. 제목은 파일의 이름으로 하고 내용은 response header에 content-disposition에 attachment 형태로 파일헤더를 추가하고 내용을 response.write로 출력을 하면 된다. 크롬에서는 다운로드 폴더로 내려오고 IE 에서는 파일창으로 열기 또는 저장 메세지 창이 뜬다. def scripts_download(request, scripts_id): scripts = get_object_or_404(Scripts, id=scripts_id) title = scripts.title.encode('euc-kr') response = HttpResponse(content_type='plain/text') response['Content-Disposition'] = 'attachment; filename=' + title response.write(scripts.contents.encode('euc-kr')) return response 업로드 구현은 찾는데 조금 고생을 하였는데 post 형식으로 파일을 전달시 장고에서 csrf에 대한 보호모드를 적용해야 되서 아래와 같이 @csrf_exempt 와 @csrf_protect 데코레이터 함수로 구현을 한다. 로그인 사용자만 업로드할 수 있게 login_required 함수도 같이 적용하였다. 업로드는 UploadFileForm이라는 Form 클래스로 화면을 구현하고 화면의 form이 유효한 화면이면 업로드를 하고 그렇지 않으면 다시 업로드 화면으로 돌아간다. 업로드 폼은 간단하고 Form을 상속받아 파일 필드를 가지는 폼으로...

[uscript] 7장. script detail 만들기

스크립트 id 값으로 조회하는 상세화면을 만들어보자. update와 동일하고 수정할수 있느냐 없느냐의 차이만 있다. url을 아래와 같이 추가하자. url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), detail.html 을 다음과 같이 만든다. <div class="total-page"> <h4>{{ scripts.title }}</h4> {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} {% csrf_token %} <div class="code-page"><pre><code>{{ scripts.contents }}</code></pre></div> <p><label name="tag-list">Tag:</label> {{ taglist }} </p> <a class="btn btn-default" href="update/"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit</a> <a class="btn btn-default" href='/scripts/{{ scripts.id }}/download' > <span class="glyphicon glyphicon-download" aria-hidden...

[uscript] 6장. script update 만들기

이번에는 스크립트 업데이트 화면을 만들어본다. 스크립트를 작성하였다면 script id 값으로 데이터가 생성되었으므로 생성(add)과 다르게 id 값으로 수정화면으로 접근한다. urls.py 에서 update 화면과 update submit 을 처리하는 view를 만든다. url(r'^(?P<pk>\d+)/update/$', views.ScriptsUpdateView.as_view(), name='update'), url(r'^(?P<scripts_id>\d+)/update/submit/$', views.scripts_update, name='update_submit'), url에서 보면 update id 값으로 화면을 조회하고 submit을 할 수 있게 구성하였다. 수정화면은 작성화면과 동일하게 구성한다. update.html 을 다음과 같이 작성한다. add.html과 다른 점은 action에 url에 파라미터로 scripts.id가 들어간다. <form action="{% url 'scripts:update_submit' scripts.id %}" method="post" class="form-inline"> {% csrf_token %} <table class="table"> <tr> <td>Title</td> <td><input class="form-control" type="text" name="title" value="{{ scripts.title }}" /></td> </tr> <tr> <td>Contents</td> ...

[uscript] 5장. script add 만들기

템플릿을 만들어보자. url에서 정의한 add_submit의 이름으로 호출한다. url(r'^add/submit/$', views.scripts_add, name='add_submit'), {% url 'scripts:add_submit' %} 또는 add/submit으로 호출할수도 있다. views.py 에서 아래 함수를 만든다. django에서는 모델 정보를 매핑해서 form을 쉽게 만들수 있게 제공하고 있다. CreateView를 import 하고 상속을 받아서 사용한다. model에 우리가 작성한 모델을 매핑하고 보여줄 화면 템플릿을 지정한다. from django.views.generic.edit import CreateView class ScriptsCreate(CreateView):     model = Scripts     template_name = 'scripts/add.html' add.html 파일에서 단순하게 form.as_p() 를 호출하면 알아서 화면을 보여주는데 화면이 별로 예쁘게 보이지 않는다면 직접 화면을 구성할 수 있다. django에서 모델을 이용한 View를 만드는 샘플이다. # views.py from django.views.generic.edit import CreateView , UpdateView , DeleteView from django.core.urlresolvers import reverse_lazy from myapp.models import Author class AuthorCreate ( CreateView ): model = Author fields = [ 'name' ] class AuthorUpdate ( UpdateView ): model = Author fields = [ 'name' ]...

[uscript] 4장. url을 만들자

django project를 생성하면 urls.py 파일이 만들어지는데 아래와 같이 django.conf.urls의 petterns, url을  import 한다. 그리고 url에 해당하는 실제 구현부분은 views.py 에 구현이 된다. 그래서 views 파일을 import 해야한다. urlpatterns 라는 url 관리 객체에 주소를 담는데 정규식을 이용하여 주소를 검색할 수 있게 지원이 된다. petterns의 첫부분은 '' 로 들어가는데 prefiex 부분으로 url의 시작부분을 지정할 수 있다. 공백이 아니라 'script' 라고 되어 있다면 그 아래에 나오는 add라는 주소는 다음과 같이 호출을 해야 한다 scripts/add 보통 프로젝트에서 ''로 시작하고 하위 app 에서는 urls.py를 include 로 붙이는데 주소의 경로가 "프로젝트/앱/url" 정의로 구성할 수 있다. url에 name으로 지정한 이름은 html 파일에서 주소를 찾을 때 이름값을 쓰면 url의 주소를 매칭해서 변환해준다.  html 파일에서 url을 지정할때 /scripts/add 라고 넣을수도 있지만 {% url 'scripts_add' %} 로 입력해도 주소를 변환해서 링크로 만들어준다. from django.conf.urls import patterns, url from scripts import views urlpatterns = patterns('',     url(r'^$', views.search_page, name='index'),     url(r'^add/$', views.ScriptsCreate.as_view(), name='scripts_add'),     url(r'^add/submit/$', views.scripts_add, name='add_s...

[uscript] 3장. Model을 만들자

모델을 만들어 보자. MVC 에서 보통 Model View Controller 라고 얘기하는데 django 에서는 Model View Template 이라고 많이 쓴다. MVC에서 Control에 해당되는게 django에서는 View 이다. 그리고 View(화면)으로 얘기하는 부분이 템플릿에 해당한다. 모델은 데이터를 담아두는 공간으로 데이터베이스에서는 테이블에 해당된다. django 에서는 모델을 클래스로 정의하여 database api를 통해 모델과 연동이 된다. 즉, 따로 데이터베이스 설계를 하지 않고 모델을 정의해서 데이터베이스에 대한 상세한 내용을 알지 못해도 구현이 가능하다. 모델은 django.db의 models로 구현이 된다. 아래를 import 하자 from django.db import models import datetime from django.utils import timezone from django.contrib.auth.models import User django의 모델을 사용하기 위해서 models와 사용자 객체를 이용하기 위한 User를 import 해야 한다. 스크립트 관리자의 모델은 아래와 같이 정의한다. class Scripts(models.Model):     title = models.CharField('Title',max_length=200)     contents = models.TextField()     pub_date = models.DateTimeField('PubDate',default=timezone.now())     user=models.ForeignKey(User) models 에 있는 Model 부모객체를 상속받아 Scripts라고 이름을 정하였다. 앞에서 설정한 syncdb 명령을 내리면 scripts 테이블이 생성된다. $ manage.py sql scripts 명령을 ...

[uscript] 2장. 프로젝트 및 앱 생성

이미지
django가 설치되었다고 가정하고 진행한다. 만약 설치되어 있지 않으면 다음과 같이 설치한다. $ pip install django 우선 프로젝트를 생성해야 한다. 프로젝트는 커맨드 창에서 다음과 같이 입력한다. $ django-admin.py startproject uscript 프로젝트를 생성후 스크립트를 관리하는 앱을 생성한다. $ cd uscript $ manage.py startapp scripts 생성이 제대로 되었다면 runserver 명령으로 테스트서버를 띄워본다. $ manage.py runserver 위 2줄 명령으로 간단히 테스트 서버를 만들어보았다. 제대로 구동이 된다면 아래와 같이 localhost를 띄워 볼 수 있다. D:\uscript>manage.py runserver Validating models... 0 errors found March 10, 2015 - 21:52:07 Django version 1.6, using settings 'uscript.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. 테스트 웹 화면을 띄웠지만 아직은 아무것도 준비된게 없다. Ctrl-C 를 눌러 웹서버를 중단하고 다음과 같이 입력한다. $ manage.py syncdb syncdb를 입력하면 데이터베이스가 만들어진다. django에서 기본적으로 sqlite3으로 지정되어 있어 별도의 데이터베이스 연결없이 바로 만들어 볼 수 있다. syncdb 명령을 내리면 사용자, 그룹 관련 테이블이 자동으로 만들어지고 super user 아이디를 등록할 수 있다. 관리자 모드로 들어가기 위해서 필요한 아이디이기 때문에 만들어야 한다. 다시 개발서버를 띄워보자. 이번에는 브라우저에서 http://localhost:8000/admin 이라고 입력...

[uscript] 1장. 스크립트 관리자 개요

이미지
SI 업무를 하면서 가장 많이 작성하게 되는게 SQL 쿼리문인데, 쿼리문을 다음에 사용하기 위해 폴더로 관리를 해도 나중에 다시 사용하려면 찾기 어려운 경우가 많다. 어떻게 분류를 잘하더라도 시간이 지나면 어떤 이름으로 저장했는지 찾기가 어려워 스크립트 관리자를 만들어 볼 생각을 하였다. 내용은 간단하다. 블로그처럼 제목, 내용으로 작성하고 제목, 내용, 태그를 통해서 검색을 할 수 있는 간단한 기능을 구현한다. 그리고 스크립트를 업로드, 다운로드를 할 수 있게 구현하여 작성한 스크립트를 서버로 바로 올릴 수 있게 작성할 예정이다. 만든 소스는 아래의 github 사이트에서 다운로드 가능하다. https://github.com/shsong97/uscript.git 실제로 활용하기 위해 Heroku에 서비스로 올려뒀다. http://uscripts.herokuapp.com/scripts/ 완성된 모습은 다음과 같이 될 것이다.

웹페이지로 엔젤이 수다펜 만들기

이미지
주말이라고 토이저러스에 놀러갔는데 사고 싶은게 없냐고 물어보니 사고 싶은게 없다고 해서 집으로 오려는데 오는 길에서 수다펜이 사고 싶다고 하는겁니다. 토이저러스에서 말했으면 사줬을것 같은데 인터넷으로 판매하는걸 보니 매장에서 사는것보다는 싼것 같아서 일단은 나중에 인터넷으로 사준다고 하고 집으로 왔는데 프로그램을 하는 사람으로서 웹페이지로 만들어주면 어떨까 하는 생각에 급하게 만들어 봤습니다. 개발 환경은 django인데 이번 페이지는 django와는 상관은 없고 웹서버 띄우는 용도로만 사용했습니다. Html 코드는 아래와 같이 만들었습니다. 스타일 시트 부분 배경화면이 되는 이미지를 div 태그에 넣기 위해 back_ground 라는 이름으로 id를 만듭니다. 그리고 버튼을 클릭하면 나오는 audio tag는 화면에서 보이지 않게 숨겨두었습니다. body 안에는 div 태그로 아래와 같이 작성합니다. 버튼을 클릭시 소리가 나오도록 input type에 button으로 작성하고 onClick시 EvalSound 함수를 작성합니다. input class는 bootstrap을 이용하여 버튼을 표시한 것이고 필요없으면 삭제해도 됩니다. 가중 중요한 소리 파일입니다. audio 태그는 Html의 마지막 부분에 추가로 넣으면 됩니다. 오디오 파일의 경우는 마이크가 없어서 스마트폰에서 음성녹음을 하고 녹음된 파일을 PC에 저장하였습니다. 버튼을 클릭시 수행할 자바스크립트입니다. EvalSound는 audio 태그를 찾아서 play를 실행해주는 함수이고 randSound는 등록된 audio중 랜덤으로 소리를 실행해주는 함수이다. 실제로 구현된 화면입니다. 수다펜은 아니지만 어차피 원리는 비슷하니까요. 웹으로 구현을 해주니 좋아하네요. 그래도 수다펜은 사달라고 합니다 ^^

heroku 에서 두번째 앱 올리기

이미지
처음에 올린 경험이 있어 django로 만든 앱을 다시 올렸더니 Application Error가 떡하니 떠주신다... 예전에 보던 에러... 다시 시작되는가 했는데 이번에는 성공한 케이스가 있어 처음 올린 파일의 셋팅과 비교해 보았다. 성공한 예는 헤로쿠에서 샘플 프로젝트를 다운로드 받아서 올렸는데 문제가 없었다. 이번에는?? 동일한 문제일거라고 생각하고 settings.py를 확인했는데 크게 문제는 없었다. heroku에서 사용하는 Procfile과 requirements.txt 파일을 동일하게 복사하였고 syncdb 도 잘 수행이 되었다. 도스창에서 heroku라고 입력을 하니 명령줄 옵션이 나오는데 그 중에서 heroku logs 라고 입력을 해본다. 로그에 나온 리스트를 보면 gettingstarted.wsgi를 import 못한다고 에러가 뜬다. gettingstarted를 만든적이 없는데?? heroku 에서 내 app을 보면 dynos web 에  gunicorn gettingstarted.wsgi --log-file -  있다. 기본적으로 헤로쿠에 셋팅된 값이 gettingstarted를 찾는것 같다. 그래서 gettingstarted 폴더를 만들고 wsgi.py 파일을 원래 폴더에서 복사를 해서 붙여넣고 업로드 했더니 잘올라왔다. 혹시나 해서 Procfile 파일을 열어서 보니 gunicorn 설정에 들어있다. 알고보니 Procfile의 정보를 읽어서 wsgi를 수행하는 것이었다. Procfile에서 kids.wsgi로 수정하니 다시 제대로 프로젝트를 물고 올라간다.  결국 업로드하기 위해서는 requirements.txt, Procfile, settings.py 만 수정해서 올리면 된다.

django 에서 MEDIA URL 지정방법

Settings.py 에서 MEDIA URL과 Root를 아래와 같이 지정하고 MEDIA_URL = '/media/'MEDIA_ROOT = os.path.join( os.path.abspath(os.path.dirname(__file__)), 'media', ) 모델에서 이미지필드를 지정한다. class Item(models.Model): item_name = models.CharField(max_length=100) item_desc = models.TextField() item_image = models.ImageField(upload_to='image') def __unicode__(self): return self.item_name Settings.py에서 현재 프로젝트의 절대경로 밑에 media로 되어있어 파일을 업로드 하면 프로젝트폴더/프로젝트폴더/media/image 폴더에 파일이 들어온다. 그리고 프로젝트의 URL에 아래와 같이 static을 추가한다. from django.conf import settings from django.conf.urls.static import static urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^shop/', include('shop.urls')), ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 앱폴더에서 호출할때는 다음과 같이 호출하면 된다. <li><img src="{{ item.item_image.url }}">{{ item.item_name }}...

Heroku app 등록 요약

로그인 heroku login 샘플 프로젝트 복사 git clone https://github.com/heroku/python-getting-started.git cd python-getting-started 앱 생성 및 이름 변경 Deploy the app heroku create heroku apps:rename NEWNAME 깃 업로드 gid add . git commit -m "test" git push heroku master 웹 생성 및 열기 heroku ps:scale web=1 heroku open 로컬에서 venv 활성화 후 사용 c:\python27\scripts\venv/Scripts/activate 외부 프로그램 설치 pip install -r requirements.txt --allow-all-external 쉘 명령 수행 heroku run python manage.py shell db 싱크 heroku run python manage.py syncdb heroku run python manage.py shell 기존에 개발된 소스를 헤로쿠와 연결하려면 아래와 같이 git remote 명령을 통해 기존 설정을 가져온다. heroku git:remote --app kids-tv