django 04. 장고 개인 프로젝트 1 - 개발과정 기록
01 Mar 2017 | python 파이썬 Django 템플릿django 04. 장고 개인 프로젝트 (메모 앱)
첫 장고 개인 프로젝트 진행 중 새롭게 배운 부분을 정리하였습니다.
결과물
장고 프로젝트 준비
- 가상환경(virtualenv) 설치 및 장고 설치
- 프로젝트 및 app 생성 (setting.py 수정)
Model 클래스 작성
DB 연동을 위한 model class를 작성한다.
- 모델 내에 모델 클래스 작성 (models.py)후, 장고에 migrate - DB 테이블과 유사
- admin superuser 등록 후, admin.py에 모델 클래스 등록
- 장고 가이드 문서 Model field reference 를 통해 model field의 data type, optiond 을 참고할 수 있다.
- models.py 에 모델 클래스 작성 후, 장고에게 모델을 만들었다는 걸 알려줘야 한다.
$ python manage.py makemigrations
$ python manage.py migrate
- 클래스 대표 값은
__str__
메소드를 통해서 정의한다.
def __str__(self):
return '%s by %s' % (self.title, self.name)
- 작성 시간은
timezone 모듈
을 사용한다. (models.py 코드예시)
from django.db import models
from django.utils import timezone
# Create your models here.
class Memos(models.Model):
name = models.CharField(max_length = 20, db_column='이름')
title = models.CharField(max_length = 50, db_column='제목')
text = models.TextField(max_length = 150, db_column='내용', help_text='메모 내용은 150자 이내로 입력 가능합니다.')
update_date = models.DateTimeField()
priority = models.BooleanField(db_column='중요')
def generate(self):
self.update_date = timezone.now()
self.save()
def __str__(self):
return '%s by %s' % (self.title, self.name)
views와 템플릿, 템플릿과 정적파일 연동
- 템플릿 폴더 및 html 파일 작성 후, views와 연동
- 템플릿 html 파일과 static css 파일 연동
- static 파일 작성 후 장고에게 알려준다 - collectstatic
- 템플릿 파일(html) 경로 : memo_app/template/memo_app/default.html
- 정적 파일(css) 경로 : memo_app/static/css/default-style.css
MTV 연동하기
- view에 model 클래스를 import 하고 데이터 불러오기
- view에서 불러온 model 클래스 데이터를 template파일에 for문으로 적용하기
입력 - form 만들기, post 처리
- app 폴더 내부에 forms.py 작성, 모델 클래스 추가
- form.html 템플릿 작성
- urls.py 추가 후에 view 와 연결(forms.py 데이터 가져오기), view와 템플릿 연결
- post 분기 처리를 위한 views.py 수정
수정 - modify 처리
가이드 문서 찾아보고 적용 하느라 오래걸렸다..ㅠㅠ 조만간 이런때도 있었지 하고 추억하는 날이 오겠지!
url 패턴 추가 (urls.py)
primary key를 url 일부분으로 갖는 url 패턴 추가
urlpatterns = [
...
url(r'^(?P<memokey>[0-9]+)/modify/$', views.modify, name='modify_memo'),
]
view에 modify 메소드 추가 (views.py)
클래스 PostForm import 필요 수정하는 화면 / 수정후 저장하는 POST request 분기 필요 기존에 존재하는 데이터는 form = PostForm(instance = memo) 를 통해 다시 가져올 수 있음
from .forms import PostForm
def modify(request, memokey): #memokey 변수를 url에서 가져온다
if request.method == "POST":
#수정 저장
memo = Memos.objects.get(pk = memokey)
form = PostForm(request.POST, instance=memo) # 새로 입력된 인스턴스 데이터를 form 인스턴스에 새로 담는다.
if form.is_valid():
form.save() # 변경한 form을 저장한다 (수정, 업데이트)
return redirect('index')
else:
#수정 입력
memo = Memos.objects.get(pk = memokey) # 특정 데이터를 인스턴스에 담는다.
form = PostForm(instance = memo) # 기존에 존재하는 데이터를 가져온다. (수정화면에 내용 포함)
return render(request, 'memo_app/modify.html', {'memo' : memo, 'form' : form})
modify.html 탬플릿 추가
인스터스로 가져온 form을 그대로 표시한다. (입력화면과 동일)
<form method="POST" class="post-form">
{%csrf_token%}
{{form.as_ul}}
<button type="submit" class="save btn btn-default">저장</button>
</form>
각 데이터의 primary key를 url로 받도록 처리
<a href="{% url 'modify_memo' memokey=memo.pk %}" class="btn btn-primary modify" role="button">수정</a>
삭제 - delete 처리
url 패턴 추가 (urls.py)
primary key를 url 일부분으로 갖는 url 패턴 추가
urlpatterns = [
...
url(r'^(?P<memokey>[0-9]+)/delete/$', views.delete, name='delete_memo'),
]
view에 delete 메소드 추가 (views.py)
memokey 를 primary key로 갖는 특정 데이터를 인스턴스로 받고, 해당 인스턴스 데이터를 삭제
def delete(request, memokey):
memo = Memos.objects.get(pk = memokey)
memo.delete()
return redirect('index')
각 데이터의 primary key를 url로 받도록 처리
삭제버튼 클릭시 confirm 결과에 따라 submit을 취소 할 수 있다.
<a href="{% url 'delete_memo' memokey=memo.pk %}" class="btn btn-default del" role="button" onclick="return confirm('정말 삭제하시겠습니까?')">삭제</a>