app_name/static/
{% load static %}
하기{% static 'articles/sample.png' %}
STATIC_ROOT
python manage.py collectstatic
명령어로 사용STATIC_URL
/
로 끝나야함STATICFILES_DIRS
어플.static/articles
을 만들어 사진을 넣는다.페이지.html
로 가서{% load static %}
넣기 - {% extends %}
밑에base.html
에 {% load static %}
을 넣어버리고 extends로 상속받으면 될것같지만, 이렇게 하면 작동을 하지 않음<img src ="{% static 'articles/sample.png'}">
프로젝트폴더.static/stylesheets
경로 만들기
base.html
에
{% block css %}
{% endblock %}
으로 css 블럭 만들기css 적용 원하는 HTML 으로 가서 css 블록 안에
<link rel="stylesheet" href="{% static 'stylesheets/style.css' %}">
프로젝트.settings.py
STATIC_URL='/static/'
STATICFILES_DIRS= [ BASE_DIR / '프로젝트이름' / 'static']
미디어 파일 (media files)
사용하기 위해서는 몇가지 단계를 거쳐야함
프로젝트.settings.py
에 MEDIA_ROOT
, MEDIA_URL
설정upload_to
속성을 정의하여 업로드 된 파일에 사용할 MEDIA_ROOT 의 하위 경로 지정url
attribute를 통해 사용가능MEDIA_ROOT
MEDIA_ROOT
와 STATIC_ROOT
는 서로 다른 경로를 가져야함MEDIA_URL
/
)로 끝나야함https://docs.djangoproject.com/ko/3.1/howto/static-files/#serving-static-files-during-development
어플.models.py
에 Article(models.Model)
안에 image 필드 만들기
하지만 이렇게 하면 에러가 날 것
프로젝트.settings.py
에 INSTALLED_APPS 에 추가하지 않아도됨image = models.ImageField(blank=True)
''
(빈문자열)이 저장되게 디ㅗㅁfrom django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=10)
content = models.TextField()
image = models.ImageField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
python manage.py makemigrations
로 데이터베이스 스키마 만들기
python manage.py migrate
로 데이터 베이스에 방금만든 스키마 적용
잘 적용됬는지 create.html
로 가서 확인해보기
이미지파일
선택이 기본으로 되어있음파일을 전송하려면 form 속성을 바꿔줘야함
enctype 속성
<form>
태그의 enctye 속성은 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시<form>
요소의 method 속성값이 POST
인 경우에만 사용가능속성값 | 설명 |
---|---|
application/x-www-form-urlencoded | 기본값으로, 모든 문자들은 서버로 보내기 전에 인코딩됨을 명시함. |
multipart/form-data | 모든 문자를 인코딩하지 않음을 명시함.이 방식은 요소가 파일이나 이미지를 서버로 전송할 때 주로 사용함. |
text/plain | 공백 문자(space)는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시함. |
<form action="" method="POST" enctype="multipart/form-data">
로 바꿔주기
input 태그 - accept 속성
어플.views.py
에 가서 create method를 변경해주기
form = ArticleForm(request.POST, request.FILES)
detail.html
에서 사진이 표시될 수 있도록 하기
<img src="{{ article.image.url }}">
{{ article.image }}
를 출력해도 name이 나옴)프로젝트.settings.py
에 MEDIA_URL 속성 추가
서버가 Media 파일을 요청할 때 사용할 가상의 URL
MEDIA_URL ='/media/'
지금 올려놓은 파일의 위치를 보면 ROOT 폴더에 저장되어 있음을 확인할 수 있음
그래서 사용자가 올린 파일들이 저장될 위치를 지정해주어야함.
''
이기 때문에 루트폴더에 저장됨MEDIA_ROOT = BASE_DIR / 'media'
프로젝트.urls.py
에 가서 사진 경로를 만드는 걸 추가해줘야함
+static()
을 하지 않는다면, 주소는 뜨지만 media 이미지와 연동이 되지 않아 사진이 뜨지 않게된다.from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# 이거는 static 파일들 경로가 추가되는것 - 자동으로 추가되어잇음
# + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
하지만 이미지가 없는 글에 들어가면 에러가 남. 이거 처리해주어야함.
detail.HTML
에 if 문으로 존재하는지 확인
{% if article.image %}
<img src = "{{ article.image.url }}" alt="{{ article.image }}">
{% else %}
<p>이미지가 없습니다</p>
{% endif %}
HTML
파일의 form 부분에 enctype="multipart/form-data
추가어플.views.py
에 form 받는 부분 수정form = ArticleForm(request.POST, request.FILES, instance=article)