관리 메뉴

Storage Gonie

46. (app3) photo form 만들기(사진 업로드 페이지) / login 템플릿 수정(로그인 성공시 바로 이전페이지로 이동) 본문

웹개발/Django 웹서비스 개발(인프런)

46. (app3) photo form 만들기(사진 업로드 페이지) / login 템플릿 수정(로그인 성공시 바로 이전페이지로 이동)

Storage Gonie 2019. 2. 23. 03:40
반응형

1. froms.py에서 Photo 모델을 imprt해주고 UploadFrom을 추가해준다.

from .models import Photo

# 사진 업로드 폼
class UploadForm(forms.ModelForm):
comment = forms.CharField(max_length=255)
class Meta:
model = Photo # 어떤 모델과 연결할지
exclude = ('thumnail_image', 'owner') # 입력받지 않을 필드를 표시가능, 이 부분은 코드로 처리해주기 위해

2. views.py에서 UploadForm 를 import해주고 upload 메소드를 추가해줌

from .forms import CreateUserForm, UploadForm
def upload(request):
form = UploadForm()
return render(request, 'kilogram/upload.html', {'form', form})

3. templates/kilogram/upload.html 생성

- 대용량 데이터인 이지미파일을 보낼 때는 enctype을 꼭 지정해줘야한다.

{% extends 'kilogram/base.html' %}
{% block content %}

<h1>Kilogram Main Upload</h1>

<form action = "{% url 'kilogram:upload' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Upload"/>
</form>

{% endblock %}

4.  kilogram/urls.py에서 url을 추가해준다.

url(r'^upload$', views.upload, name='upload'),

5.  views.py의 upload 메소드 수정, redirect모듈 import

- 폼 화면만 보여줄 수 있던 것을 실제로 저장할 수 있도록 만드는 과정

from django.shortcuts import render, redirect
def upload(request):
form = UploadForm()
return render(request, 'kilogram/upload.html', {'form', form})
def upload(request):
if request.method == "POST":
form = UploadForm(request.POST, request.FILES) # 대용량인 이미지를 처리해야 하므로 두 매개변수를 넘겨줘야함.
if form.is_valid():
photo = form.save(commit=False) # photo객체를 가져오긴 하나 DB에 아직 저장하진 않음
photo.owner = request.user # request.user는 로그인한 사용자
form.save()
return redirect('kilogram:index')

4. 로그인한 뒤 localhost:8000/kilogram/upload에 접속해서 실제로 사진을 업로드 해본다.

5. admin페이지에서 확인

- 정상적으로 업로드 된 것을 확인할 수 있음.

6. 로그인을 한 사용자만 upload url을 이용할 수 있도록 제한하는 기능

- views.py에서 데코레이터 기능 추가

from django.contrib.auth.decorators import login_required
@login_required   # 메소드에만 적용가능
def upload(request):

7. 로그인을 하면 로그인 바로 직전의 페이지가 뜨도록 하는 기능

- kilogram/registration/login.html에서 next의 value를 아래와 같이 채워줌

- 로그인 버튼 클릭 시 get으로 받은 next값을 전달해주도록 수정하는 것임.

<input type="hidden" name="next" value="{{next}}" />

- 로그인 없이 localhost:8000/kilogram/upload에 접속하면 로그인 페이지가 뜨며 이때 화면의 소스코드의 일부를 보면 다음과 같이 채워진 것을 볼 수 있음.

- 이것이 next의 기능.

<input type="hidden" name="next" value="/kilogram/upload" />

반응형
Comments