我需要通过包含索引文件和静态文件的 django 管理面板上传模板

I need to upload templates through django admin panel which contain index file along with static files

我正在尝试创建一个门户网站,从不同用户那里获取登陆页面模板并手动检查该模板是否是工作文件。

如果一切看起来不错,那么我想从我的 django 管理面板上传那个主题,它为每个模板创建一个新文件夹,就像在本例中它的 template1,template/theme/template1/index.html 文件夹以及我想要的静态文件一样为静态文件的所有文件夹上传 zip 文件,后端会发生什么是转到文件夹 static/template1/(unzipped static files),其中解压缩的静态文件是所有静态文件将自行解压缩的位置,以便我的 index.html 和静态文件可以相互通信。

我找不到任何解决方案。

我们如何制作一个上传文件的模型,每次都创建一个新文件夹?

from django.db import models

from django.contrib.auth.models import User
from django.db import models

class themes(models.Model):
     index_file = models.filefield(upload_to=???????)
     static_files = models.filefield(upload_to =?????)

我也不想每次上传新模板设计时都收集静态数据。

在此处编辑 2 >> 在我的 models.py 中,我尝试这样做,但出现错误。 ,我哪里做错了?

def index_path_upload(instance, filename):
    if not instance.pk:
       # get count of all object, so is will be unique
       number = instance.__class__.objects.count() + 1
    else:
       number = instance.pk
    # replace filename to all object have the same
    filename = "index.html"
    return f"templates/theme/template{number}/{filename}"

def static_path_upload(instance, filename):
    if not instance.pk:
       # get count of all object, so is will be unique
       number = instance.__class__.objects.count() + 1
    else:
       number = instance.pk
    # replace filename to all object have the same
    return f"static/template{number}/+.zip"


class themes(models.Model):
     index_file = models.FileField(upload_to=index_path_upload)
     static_file = models.FileField(upload_to=static_path_upload)

我需要在我的设置文件中添加其他东西吗,目前我有这个。

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
STATIC_ROOT = os.path.join(BASE_DIR, 'assets')


MEDIA_URL = 'static/'
MEDIA_ROOT = (os.path.join(BASE_DIR,'static/'))

为什么不喜欢这样?

FileField 中的 upload_to 键接受这样的函数

def index_path_upload(instance, filename):
    if not instance.pk:
       # get count of all object, so is will be unique
       number = instance.__class__.objects.count() + 1
    else:
       number = instance.pk
    # replace filename to all object have the same
    filename = "index.html"
return f"template/theme/template{number}/{filename}"

instance 参数是您的对象(主题模型) ,filename参数是上传文件的原始文件名

所以你的模特喜欢

def index_path_upload(instance, filename):
  ...

class themes(models.Model):
     index_file = models.filefield(upload_to=index_path_upload)
     ...

编辑:

from django.conf import settings
import os


def index_path_upload(instance, filename):
    if not instance.pk:
       # get count of all object, so is will be unique
       number = instance.__class__.objects.count() + 1
    else:
       number = instance.pk
    # replace filename to all object have the same
    filename = "index.html"
    path =  f"templates/theme/template{number}/{filename}"
    return os.path.join(settings.BASE_DIR, path)

is 将上传到您的根目录( manage.py 在哪里)+路径 请注意,这是一个很大的安全漏洞!