Python
Django

Django ノート 4

8 HTML カスタマイズ(Web アプリファイル)

多彩なデザインを実現するため、静的ファイルが必要あります。

Django には、静的ファイルが2種類あります。一つ目は、JavaScript、CSS、Image のような事前にアップロードされた Static Files です。二つ目はユーザーがアップロードした MP4 や PDF などです。このようなファイルは Media Files と呼ばれます。

8.1 Static Files

Static Files が それぞれの APP の中の static フォルダーに入れます。

例えば:

mysite/
    manage.py
    mysite/
        static/
            css/
                bootstrap.min.css
            js/
                bootstrap.min.js
        __init__.py
        settings.py
        urls.py
        wsgi.py
    myapp/
        static/
            css/
                bootstrap.min.css
            js/
                bootstrap.min.js
        templates/
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        urls.py
        views.py

Template で使う時には:
{% static 'file PATH' %}

index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    {% load static %}
  </head>
  <body>
    <p>Test Page</p>
    <script src="{% static 'js/bootstrap.min.js' %}"/>
  </body>
</html>

static files folder は settings.py で STATIC_URL が指定できます。

e.g.

#STATIC FILES ファイルアクセス PATH
STATIC_URL = '/static/'
#STATIC FILES ファイル保存 PATH
STATIC_ROOT = '/static/'

8.2 Media Files

settings.py で MEDIA_ROOT パラメータを指定します。
e.g.

#メディアファイル保存 PATH
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#メディアファイルアクセス PATH
MEDIA_URL = '/media/'

models.py 書き方:

models.py
        ...
class File(models.Model):
    filedata = models.FileField(upload_to='files')
    filepic = models.ImageField(null=True, upload_to='pics')
    uploadtime = models.DateTimeField('updated time', default = timezone.now)
        ...

FileFiled の upload_to パラメータはサブフォルダー指定します。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')FileField(upload_to='files')の場合は:
アップロードされるファイルが ./media/files/ に保存されます。

views.py 書き方:
アップロード時:

      ...
def play(request, id):
    f = File.objects.get(id=id)
    data = {'video': f}
    #url 値を使用する
    data['url'] = f.filedata.url
    return render(request, 'player.html', data)
      ...

ファイル使用:

views.py
      ...
def uploadfile(request):
    if request.method != 'POST':
        return render(request, 'upload.html')

    if not form.is_valid():
        return render(request, 'upload.html')

    if 'filedata' in request.FILES:
        filedata = request.FILES['filedata']
    else:
        return render(request, 'upload.html')

    if 'filepic' in request.FILES:
        filepic = request.FILES['filepic']
    else:
        filepic = None

    try:
        f = File(filedata=filedata, filepic=filepic)
        f.save()
        return render(request, 'success.html')
    except:
        return render(request, 'upload.html')
      ...

Template 書き方:

player.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    {% load static %}
  </head>
  <body>
    <video src={{ url }} width="640" height="480" preload="none" autoplay class="videoPlayer" controls="controls">
        Your browser does not support the video tag.
    </video>
    <script src="{% static 'js/bootstrap.min.js' %}"/>
  </body>
</html>

プロジェクトの urls.py 書き方:

urls.py
from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^play/(?P<id>\d+)/$', views.play, name='play'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

ファイルを削除する場合は:

Database で オブジェクトだけではなく、ファイルの削除を忘れないように:

views.py
        ...
try:
    existfileObj = File.objects.get(filename=filename)
    os.remove(existfileObj.filedata.path)
    existfileObj.delete()
except File.DoesNotExist:
    print('File in not exist.')
    existfileObj = None
else:
    #path 値を使用する
    os.remove(existfileObj.filedata.path)
    os.remove(existfileObj.filepic.path)
    existfileObj.delete()
        ...