1. model에 Image 추가하기
- app > models.py
# articles/models.py/class Article
image = models.ImageField(blank=True)
- cf ) blank vs null
- 공통점 : default = False
- blank = True : 유효성 검사 (.is_valid()에서 빈 값을 입력할 수 있다.)
- null = True : 빈 값을 NULL로 DB에 저장한다.
- 왜 이미지 필드는 blank 값을 사용할까? → DB의 일관성 관점에서, 문자열로 저장되기 때문. 문자열은 빈 문자열을 ‘ ‘ 로 표현. → 데이터가 없음을 중복해서 표현(x)
python manage.py makemigrations
를 진행해보면 에러가 뜬다.articles.Article.image: (fields.E210) Cannot use ImageField because Pillow is not installed.
- 즉, Image Field를 이용하려면 Pillow 를 설치해야 한다.
$ python -m pip install Pillow
진행하고 migration 을 진행해 본다.
2. ArticleForm에서 image 필드 출력 확인
- 파일 또는 이미지 업로드 시에는 form 태그에 enctype(인코딩타입) 속성을 변경해야 한다.
- 전송되는 데이터 타입을 지정해 주는 것이다.
# articles / templates / create. html # form 의 뒷 부분에 enctype을 추가해준다. <form action="{% url 'articles:create' %}" method="POST" enctype = "multipart/form-data">
3. request. FILES 수정
- 파일 및 이미지는 POST 가 아닌, FILES 로 들어간다
# articles / views.py
def create(request):
if request.method == 'POST':
# POST 뒤에 FILES 추가
form = ArticleForm(request.POST, request.FILES)
if form.is_valid():
article = form.save(commit=False)
article.user = request.user
article.save()
return redirect('articles:detail', article.pk)
else:
form = ArticleForm()
context = {
'form': form,
}
return render(request, 'articles/create.html', context)
4. DETAIL 페이지 수정해서 출력해보기
- article / templates / detail.html
{% extends 'base.html' %}
{% block content %}
# 이 부분을 추가해준다. src는 경로가 들어가야 하기 때문에 url이 들어간다.
<img src="{{ article.image.url }}" alt="{{ article.image }}">
<h1>DETAIL</h1>
Uploaded by N2T