외부사이트를 아이프레임으로 불러오는 경우 높이 값을 수정하고 싶을때 ‘targetWindow.postMessage’를 이용해서 필요한 데이터를 전송, 전달 받을 수 있다.
크로스도메인에서도 사용가능한 방법이다.
<!-- mysite.com -->
<iframe id ="sizetracker" src="http://redcong.com/test.php" scrolling="auto" frameborder="0" allowtransparency="true" class="reser_frame" style="height: 500px !important;"></iframe>
<script type="text/javascript">
window.addEventListener("message", function(e){
var data = JSON.parse(e.data);
console.log(data);
}, false);
</script>
<!-- example.com -->
<div>...</div>
<script type="text/javascript">
parent.postMessage(
'{"height": '+ document.body.scrollHeight +'}',
"http://mysite.com" // '*' 사용할 경우 모든 도메인 허용
</script>
이전 포스트에서 django 설치, 관리자 페이지 및 hello world 페이지 까지 작성하였다. 본 포스트에서는 리스트 페이지, 뷰페이지, 글쓰기 및 수정 삭제 기능, 페이징, 검색기능을 구현하려고 한다.
목록
리스트 페이지 작성
뷰 페이지 작성
글쓰기 페이지 작성
수정페이지 작성
삭제기능 추가
템플렛 다듬기
1 . 리스트페이지 작성
view.py에서 사용할 모델을 import한다. 그리고 현재보다 미래의 글은 리스트에 출력되면 안되기 때문에 시간을 처리해주는 장고 내장함수(timezone)를 import 한다.
#view.py
from django.shortcuts import render
from django.http import HttpResponse
from django.utils import timezone
from .models import Post
# Create your views here.
def index(requests):
posts = Post.objects.filter(published_date__lte = timezone.now())
return render(requests, 'myblog/list.html', {'posts' : posts})
render함수에 requests, ‘템플릿경로’, ‘데이터 객체’를 전달하고 리턴해주면 된다. localhost:8000/myblog 로 접속해보면 템플렛을 찾을수 없다고 에러가 발생할 것이다. 장고가 render 함수로 전달된 ‘myblog/list.html’ 부분을 찾게 해주기 위해서 해당 경로에 디렉토리 및 파일을 생성해준다.
templates 폴더 안에 앱이름으로 폴더를 생성하는 이유는 django는 프로젝트내 에서 모든 templates 폴더를 한곳으로 모아 파일을 찾는데 같은 파일이름이 있을 수 있으면 문제가 발생하기 때문에 네임스페이를 처리해주기 위해서 관행적으로 생성해준다고 한다.
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('autor', 'title', 'content', 'created_date', 'published_date')
3) view.py 에 write함수 추가
def write(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return HttpResponseRedirect(reverse('myblog:post', args=(post.pk,)))
else :
form = PostForm()
return render(request, 'myblog/write.html', {'form' : form})
서버가 실행되면 아래와 같은 메세지가 나타난다. 중간에 미리정의된 앱이 마이그레이션되어있지 않다고 메세지가 나오는데 일단은 무시한다.
Performing system checks...
System check identified no issues (0 silenced).
You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
March 03, 2019 - 08:34:34
Django version 2.1.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
이제 localhost:8000 으로 접속해보자
관리자에 접속할수 있는 계정을 만들기에 앞서 데이터베이스를 마이그레이션 한다.
(venv) $ ./manage.py migrate
이제 다시 서버를 실행시켜보면 좀전에 나왔던 에러메세지가 나오지 않는다. 테이블을 생성했으니 관리자 계정을 추가한다.