Django Upload File and Save in Model

Subscribe to our YouTube Channel!
[Jul 12, 2021] New Video: How to Use Django Rest Framework Permissions (DRF Tutorial - Office 7)


How to Upload Files With Django

How to Upload Files With Django

Updated at Nov 2, 2018: Equally suggested past @fapolloner, I've removed the manual file handling. Updated the example using FileSystemStorage instead. Thanks!

In this tutorial y'all will larn the concepts behind Django file upload and how to handle file upload using model forms. In the end of this post you will find the source lawmaking of the examples I used then you can endeavor and explore.

This tutorial is also available in video format:


The Basics of File Upload With Django

When files are submitted to the server, the file data ends up placed in request.FILES.

It is mandatory for the HTML form to have the aspect enctype="multipart/form-data" fix correctly. Otherwise the request.FILES will be empty.

The course must be submitted using the POST method.

Django accept proper model fields to handle uploaded files: FileField and ImageField.

The files uploaded to FileField or ImageField are not stored in the database but in the filesystem.

FileField and ImageField are created as a string field in the database (unremarkably VARCHAR), containing the reference to the actual file.

If you delete a model instance containing FileField or ImageField, Django volition not delete the physical file, but only the reference to the file.

The request.FILES is a dictionary-like object. Each key in request.FILES is the name from the <input blazon="file" proper noun="" />.

Each value in request.FILES is an UploadedFile instance.

You lot will need to prepare MEDIA_URL and MEDIA_ROOT in your projection'southward settings.py.

                                  MEDIA_URL                  =                  '/media/'                  MEDIA_ROOT                  =                  os                  .                  path                  .                  bring together                  (                  BASE_DIR                  ,                  'media'                  )                              

In the evolution server you may serve the user uploaded files (media) using django.contrib.staticfiles.views.serve() view.

                                  from                  django.conf                  import                  settings                  from                  django.conf.urls.static                  import                  static                  urlpatterns                  =                  [                  # Projection url patterns...                  ]                  if                  settings                  .                  DEBUG                  :                  urlpatterns                  +=                  static                  (                  settings                  .                  MEDIA_URL                  ,                  document_root                  =                  settings                  .                  MEDIA_ROOT                  )                              

To access the MEDIA_URL in template you must add together django.template.context_processors.media to your context_processeors within the TEMPLATES config.


Elementary File Upload

Following is a minimal file upload instance using FileSystemStorage. Utilise it just to learn about the catamenia of the process.

simple_upload.html

                {% extends 'base.html' %}  {% load static %}  {% block content %}                  <grade                  method=                  "post"                  enctype=                  "multipart/class-information"                  >                  {% csrf_token %}                  <input                  type=                  "file"                  name=                  "myfile"                  >                  <push                  type=                  "submit"                  >Upload</button>                  </form>                  {% if uploaded_file_url %}                  <p>File uploaded at:                  <a                  href=                  "{{ uploaded_file_url }}"                  >{{ uploaded_file_url }}</a></p>                  {% endif %}                  <p><a                  href=                  "{% url 'home' %}"                  >Render to home</a></p>                  {% endblock %}              

views.py

                                  from                  django.shortcuts                  import                  render                  from                  django.conf                  import                  settings                  from                  django.core.files.storage                  import                  FileSystemStorage                  def                  simple_upload                  (                  request                  ):                  if                  request                  .                  method                  ==                  'POST'                  and                  request                  .                  FILES                  [                  'myfile'                  ]:                  myfile                  =                  request                  .                  FILES                  [                  'myfile'                  ]                  fs                  =                  FileSystemStorage                  ()                  filename                  =                  fs                  .                  save                  (                  myfile                  .                  proper name                  ,                  myfile                  )                  uploaded_file_url                  =                  fs                  .                  url                  (                  filename                  )                  return                  render                  (                  request                  ,                  'core/simple_upload.html'                  ,                  {                  'uploaded_file_url'                  :                  uploaded_file_url                  })                  return                  return                  (                  request                  ,                  'core/simple_upload.html'                  )                              

File Upload With Model Forms

Now, this is a way more user-friendly fashion. Model forms perform validation, automatically builds the absolute path for the upload, treats filename conflicts and other mutual tasks.

models.py

                                  from                  django.db                  import                  models                  class                  Document                  (                  models                  .                  Model                  ):                  description                  =                  models                  .                  CharField                  (                  max_length                  =                  255                  ,                  blank                  =                  True                  )                  document                  =                  models                  .                  FileField                  (                  upload_to                  =                  'documents/'                  )                  uploaded_at                  =                  models                  .                  DateTimeField                  (                  auto_now_add                  =                  True                  )                              

forms.py

                                  from                  django                  import                  forms                  from                  uploads.core.models                  import                  Document                  form                  DocumentForm                  (                  forms                  .                  ModelForm                  ):                  form                  Meta                  :                  model                  =                  Certificate                  fields                  =                  (                  'clarification'                  ,                  'certificate'                  ,                  )                              

views.py

                                  def                  model_form_upload                  (                  request                  ):                  if                  request                  .                  method                  ==                  'POST'                  :                  form                  =                  DocumentForm                  (                  asking                  .                  POST                  ,                  asking                  .                  FILES                  )                  if                  form                  .                  is_valid                  ():                  form                  .                  salve                  ()                  render                  redirect                  (                  'habitation'                  )                  else                  :                  form                  =                  DocumentForm                  ()                  render                  return                  (                  request                  ,                  'core/model_form_upload.html'                  ,                  {                  'form'                  :                  form                  })                              

model_form_upload.html

                {% extends 'base.html' %}  {% block content %}                  <grade                  method=                  "post"                  enctype=                  "multipart/form-data"                  >                  {% csrf_token %}     {{ course.as_p }}                  <push                  type=                  "submit"                  >Upload</push button>                  </class>                  <p><a                  href=                  "{% url 'home' %}"                  >Render to habitation</a></p>                  {% endblock %}              

About the FileField upload_to Parameter

See the example beneath:

                                  document                  =                  models                  .                  FileField                  (                  upload_to                  =                  'documents/'                  )                              

Notation the upload_to parameter. The files will exist automatically uploaded to MEDIA_ROOT/documents/.

It is also possible to do something like:

                                  document                  =                  models                  .                  FileField                  (                  upload_to                  =                  'documents/                  %                  Y/                  %                  m/                  %                  d/'                  )                              

A file uploaded today would be uploaded to MEDIA_ROOT/documents/2016/08/01/.

The upload_to can also be a callable that returns a string. This callable accepts two parameters, example and filename.

                                  def                  user_directory_path                  (                  instance                  ,                  filename                  ):                  # file volition be uploaded to MEDIA_ROOT/user_<id>/<filename>                  return                  'user_{0}/{one}'                  .                  format                  (                  example                  .                  user                  .                  id                  ,                  filename                  )                  course                  MyModel                  (                  models                  .                  Model                  ):                  upload                  =                  models                  .                  FileField                  (                  upload_to                  =                  user_directory_path                  )                              

Download the Examples

The lawmaking used in this postal service is available on Github.

                git clone https://github.com/sibtc/simple-file-upload.git              
                pip install django              
                python manage.py migrate              
                python manage.py runserver              


clarkdrodste1948.blogspot.com

Source: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html

0 Response to "Django Upload File and Save in Model"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel