목적은 

데이터를 입력할 때의 폼과 그 데이터를 수정할 때의 폼동일하게 쓰인다는 점에서,

1개의 폼 사용을 유지하고자 템플릿을 서로 만들지 않고 같은 템플릿을 사용하게 한다.


조건 2가지

1) url 경로와 view 함수는 서로 달라야한다. (기능이 다르므로)

2) 서로 다른 기능을 하는 것임을 표시할 수 있도록 조건에 따라 다르게 화면에 보여야한다.



1-1) url과 view 함수를 따로 만든다.


서로 다른 경로를 가지고, 서로 다른 기능을 유지하기에 고유의 url와 view 함수를 지닌다.



1-2) 매핑할 템플릿 페이지를 동일하게 지정한다.


(데이터 추가하는 add 함수)


1
2
3
4
def add(request):
    ctx = {}
    (생략)
    return render(request, "add.html", ctx)
cs


(데이터 수정하는 edit 함수)


1
2
3
4
def edit(request):
    ctx = { "replacement" : "수정" }
    (생략)
    return render(request, "add.html", ctx)
cs



2) 기존 템플릿에서 조건문을 추가한다.


(데이터 추가 텍스트만 보이는 템플릿)


1
2
3
4
5
6
추가하기
<form enctype="multipart/form-data" method="post" action="">
  {% csrf_token %}
  {{ form.as_p }}
  <button class="btn btn-default btn-block">추가</button>
</form>
cs



(조건문을 넣어서 사용하는 함수에 따라 다르게 보이는 템플릿)


1
2
3
4
5
6
{% if replacement %}{{ replacement }}{% else %}추가{% endif %}하기
<form enctype="multipart/form-data" method="post" action="">
  {% csrf_token %}
  {{ form.as_p }}
  <button class="btn btn-default btn-block">{% if replacement %}{{ replacement }}{% else %}추가{% endif %}</button>
</form>
cs


edit 함수를 매핑하는 url로 접속시 replacement호출하도록 조건을 내세워 "추가하기" 텍스트를 "수정하기" 형태로 바꾼다.

블로그 이미지

쵸잇

,

깃에서 제외할 파일을 지정할 때는 .gitignore 파일에서 제외할 부분을 목록으로 작성해서 제외시켰었다.

(https://practice-a-lot.tistory.com/26)


이번에는 폼을 통해 저장된 사진을 깃에서 제외하는 방법이다.

동일하게 .gitignore 파일에서 작성한다.


1) *.jpg *.pgn 형태로 입력하면 해당 확장자에 걸리는 모든 사진을 추출


1
2
3
db.sqlite3
*.jpg
*.png
cs


문제점은 제외하지 말아야할 사진도 포함되므로 좋은 방법이 아니다.



2) 사진이 저장된 미디어 폴더를 지정


1
2
db.sqlite3
media/
cs



'코딩 연습 > Github' 카테고리의 다른 글

깃에서 필요 없는 것 빼기  (0) 2018.10.11
블로그 이미지

쵸잇

,

텍스트와 다르게 이미지를 저장하려면 많은 수고가 든다.




1) Settings.py에서 이미지 파일을 저장베이스 폴더(media) 경로를 설정한다.


1
2
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
cs



2) Urls.py에서 개발 중미디어 파일(이미지, 비디오 등)을 다루기 위한 세팅

(단, DEBUG 상태에서만 가능하도록 if문을 별도로 작성)


1
2
3
4
5
6
from django.conf import settings
from django.conf.urls.static import static
 
if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
cs



3) Models.py에서 이미지 필드 만들기


1
image = models.ImageField()
cs


*이미지 필드 사용시 Pillow(https://pillow.readthedocs.io/en/latest/)라는 라이브러리 설치가 migrate 과정에서 요구된다.

(내가 올리는 이미지 파일의 포맷을 도와준다)



4) Forms.py에서 이미지 필드 지정하기


1
2
3
4
5
6
class Form(ModelForm):
     class Meta:
         model = 
         fields = (
             'image'
         )
cs



5) 템플릿에서 에 이미지 파일을 입력 받기 위해 이미지 전송을 위한 별도의 속성을 추가한다


1
<form enctype="multipart/form-data" method="post" action="">
cs



4) View에서 폼을 통해 입력 받은 이미지를 폼에 두고자 이미지 소스(request.FILES)를 데이터 소스와 같이 둔다. 


1
2
if request.method == "POST":
    form = Form(request.POST, request.FILES)
cs


블로그 이미지

쵸잇

,