Tip
- 과제를 30분 이상했는데, 못하겠으면 질문하자.
- 가능한 동작은 모델에 넣는게 좋다.
5. 좋아요 기능
1. post_detail.html에 form 하나 더 생성
2. 요청 view(url)가 post_like가 되도록 함
3. 요청을 받은 후 적절히 PostLike 처리
4. redirect
6. 코멘트 삭제 기능
1. post_detail.html Comment 표현 loop내부에 form을 생성
2. 요청 view(url)가 comment_delete가 되도록 함
3. 요청을 받은 후 적절히 삭제 처리
4. redirect
7. static 설정
# instagram/settings.py
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
STATIC_DIR,
]
8. CSS
static/css/normalize.css
파일 생성 후 Normalize.css을 복사 붙여넣기 한다.
# static 구성
static
├── css
│ ├── normalize.css
├── images
│ ├── sprites.png
└── scss
├── base.scss
├── common.scss
└── sprites.scss
9. 파일업로드
Basic file uploads
- view에서 파일 데이터는
request.FILES
에서 처리할 수 있다. request.FILES
는 폼의 각 FileField (or ImageField, or other FileField subclass)에 대한 키를 포함하는 딕셔너리 타입이다.- 주의 : 요청 메소드가 POST이고, ` <form>
이 enctype="multipart/form-data" 속성을 갖는 경우에만 데이터를 포함한다. 그렇지 않으면
request.FILES`가 비어있다.
def post_add(request):
if request.method == 'POST':
# 폼의 생성자에 request.FILES 전달
form = PostForm(request.POST, request.FILES)
if form.is_valid():
post = Post(
author=request.user,
content=form.cleaned_data['content'],
# 파일은 cleaned_data에 들어가지 않음
photo=request.FILES['photo']
)
post.save()
return redirect('post:list')
else:
form = PostForm()
return render(request, 'post/post_add.html', {'form': form})
request.FILES
를 폼의 생성자에 전달해야 한다. 이것은 파일 데이터가 폼에 바인딩되는 방법이다.- 파일을 UploadedFile 감싸서 장고가 알아서 chunks 하는 기능을 제공한다.
- FileField가 있는 모델에 파일을 저장하는 경우 ModelForm을 사용하면이 프 훨씬 쉽게 사용할 수 있다. 파일 객체는 form.save ()를 호출 할 때 해당 FileField의 upload_to 인수로 지정된 위치에 저장됩니다.
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField
def upload_file(request):
if request.method == 'POST':
form = ModelFormWithFileField(request.POST, request.FILES)
if form.is_valid():
# 간단하게 파일을 저장할 수 있다.
form.save()
return HttpResponseRedirect('/success/url/')
else:
form = ModelFormWithFileField()
return render(request, 'upload.html', {'form': form})
- 여러개의 파일을 업로드할 수 있다. 결과가 리스트로 반환되므로, 반복문을 통해 꺼내 쓰면된다.
Upload Handlers
- 사용자가 파일을 업로드하면, 필드 데이터를 upload handler에게 전달한다.
- upload handler는 설정의
FILE_UPLOAD_HANDLERS
에 정의되며, 기본값은 다음과 같다.
[
# 파일 크기(2.5 MB 미만)가 작을 때,
'django.core.files.uploadhandler.MemoryFileUploadHandler',
# 파일 크기가 클 때, 임시로 파일을 디스크에서 쓰다가 사용하지 않으면 지운다.
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]
10. post_add 구현
template: post_add.html
view: def post_add
url : /post/add/
form : post.forms.PostForm
# post/forms.py
class PostForm(forms.Form):
photo = forms.ImageField()
content = forms.CharField()
# post/views.py
def post_add(request):
form = PostForm()
context = {
'form': form,
}
return render(request, 'post/post_add.html', context)
# post/urls.py
url(r'^add/$', views.post_add, name='add'),
과제
- 내가 작성한 포스트에만 삭제버튼 노출
- 내가 작성한 코멘트에만 삭제버튼 노출
- 몇 명이 좋아요 했는지 노출
- Documentation 정리