갈루아의 반서재

파일을 업로드하는 페이지를 만들어봅니다.

기존에 프로젝트는 생성되어 있다고 가정하고 진행합니다.


1. setting.py 파일에 파일이 저장될 위치 지정


1
2
3
#settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
cs



2. FileField 를 가진 Document 모델 생성


1
2
3
4
5
#models.py
from django.db import models
 
class Document(models.Model):
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')
cs


3. Form 을 만든다


1
2
3
4
5
6
7
8
# forms.py
from django import forms
 
class DocumentForm(forms.Form):
    docfile = forms.FileField(
        label = 'Select a file',
        help_text = 'max. 42 megabytes'
        )
cs



4. View 를 만든다(세부 파일명 등은 사용자따라 다르시겠죠)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from django.template import RequestContex
from .models import Document
from blog.forms import DocumentForm
from django.core.urlresolvers import reverse
 
def upload_file(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()
 
            return HttpResponseRedirect(reverse('blog.data_analysis.upload_file'))
    else:
        form = DocumentForm()
 
    documents = Document.objects.all()
 
    return render_to_response(
        'blog/resource_data_analysis_fileuploading_form.html',
        {'documents': documents, 'form': form},
        context_instance=RequestContext(request)
    )   
cs


5. URL 지정을 해줍니다.


1
2
3
4
#urls.py
urlpatterns = [
    url(r'^data_analysis/uploadfile/$''blog.data_analysis.upload_file'),
]
cs



6. 템플릿 파일을 만듭니다.

(4번 항목의 resource_data_analysis_fileuploading_form.html 파일에 아래 내용을 넣어줍니다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# template 
<div class="panel-heading">
    <h3 class="panel-title">File Uploading Form</h3>
        <!-- List of uploaded documents -->
        {% if documents %}
            <ul>
            {% for document in documents %}
                <li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li>
            {% endfor %}
            </ul>
        {% else %}
            <p>No documents.</p>
        {% endif %}
</div>
 
<div class="panel-body">                    
   <!-- Upload form. Note enctype attribute! -->
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p>{{ form.non_field_errors }}</p>
        <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p>
        <p>
            {{ form.docfile.errors }}
            {{ form.docfile }}
        </p>
        <p><input type="submit" value="Upload" /></p>
    </form>
</div>                    
cs



7. 2번 항목의 Document 테이블을 생성하도록 마이그레이션을 해줍니다.


1
2
python manage.py makemigrations blog
python manage.py migrate
cs


8. 실행한 모습니다.







※ 참고사이트

https://docs.djangoproject.com/en/1.9/topics/http/file-uploads/