如何将Django访问者文件上传到新的子目录,并且目录名称应为会话名称?

时间:2019-03-23 04:10:40

标签: django

我正在创建Django应用程序。它只有一个模型类,即文件上传。它没有用户登录和注册系统。

我的目标是做到这一点,以便当有人访问该网页并上传文件时,它会在"/media"目录内创建一个新目录。并且目录名称应该唯一,也应该是会话名称。仔细阅读:

当访问者访问页面并上传文件时,它应自动创建一个新目录“ A”,即使访问者重新加载页面并上传另一个新文件时,它也应创建另一个新目录“ B”并将该会话的上传文件存储在目录“ B”上。

我的model.py

from django.db import models

# Create your models here.
class ImageForExtractText(models.Model):
    image = models.FileField()

和我的form.py

from django import forms
from .models import ImageForExtractText

class UploadImage(forms.ModelForm):
    class Meta:
        model = ImageForExtractText
        fields = [
            'image',
        ]

view.py

from .forms import UploadImage
from django.shortcuts import render, redirect

def upload(request):
    form = UploadImage(request.POST or None, request.FILES or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
    return render(request, 'home.html', {'form': form})

还有我的setting.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media")

希望我对我的问题很清楚,如果我所说的不清楚,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以将函数引用传递到文件字段的upload_to属性。此函数应具有动态路径(随机目录),并且将按以下方式自动创建。

import os
import uuid
from django.conf import settings
from django.db import models


def image_path(_, file_name):
    return os.path.join(settings.MEDIA_ROOT, str(uuid.uuid4()), file_name)


# Create your models here.
class ImageForExtractText(models.Model):
    image = models.FileField(upload_to=image_path)