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 정리