django - django - 将文件上传到特定文件夹
问题描述
我有一个用户配置文件,它捕获用户名和用户分配到的组。我希望将上传的文件保存在组名文件夹下。文件夹已经存在于媒体根目录,文件应该被路由到这些文件夹
我通过给出的解决方案解决了这个问题。现在,用户名在上传页面上显示为下拉列表。我只想显示或排除已记录的用户名,甚至显示它
模型.py
class uploadmeta(models.Model):
path = models.ForeignKey(Metadataform, on_delete=models.CASCADE)
user_profile = models.ForeignKey(UserProfile, on_delete=models.CASCADE, null=True, verbose_name='Username')
tar_gif = models.FileField(upload_to=nice_user_folder_upload, verbose_name="Dataset") # validators=[FileExtensionValidator(allowed_extensions=['tar', 'zip'])]
def __str__(self):
return self.request.user.username
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
Group= models.CharField(max_length=500, choices=Group_choices, default='Please Select')
def __str__(self):
return self.user.username
视图.py
def uploaddata(request):
if request.user.is_authenticated:
if request.method == 'POST':
form = uploadmetaform(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('file_list')
else:
form = uploadmetaform()
return render(request, 'uploaddata.html', {
'form': form
})
else:
return render(request, 'home.html')
表格.py
class uploadmetaform(forms.ModelForm):
count = Metadataform.objects.all().latest('id').id #To know the id of latest object
data = Metadataform.objects.all().filter(id=count) #return the queryset with only latest object
path = forms.ModelChoiceField(queryset=data)
def __init__(self, *args, **kwargs):
super(uploadmetaform, self).__init__(*args, **kwargs)
count = Metadataform.objects.all().latest('id').id
data = Metadataform.objects.all().filter(id=count)
self.fields['path'] = forms.ModelChoiceField(queryset=data)
class Meta:
model = uploadmeta
fields = ['path', 'user_profile','tar_gif',]
解决方案
您可以upload_to
使用FileField
. 它接受一个字符串,表示您要存储文件的路径,或者您可以传入一个函数,让您添加更多详细信息。
来自文档的更多信息:https ://docs.djangoproject.com/fr/2.2/ref/models/fields/#django.db.models.FileField.upload_to
您可能需要添加一个外键表单uploadmeta
来UserProfile
喜欢:
user_profile = models.ForeignKey(UserProfile, on_delete=models.PROTECT)
然后你可以使用以下
def nice_user_folder_upload(instance, filename):
extension = filename.split(".")[-1]
return (
f"your_already_definied_folder/{instance.user_profile.group}/{file}.{extension}"
)
然后用在uploadmeta
FileField
doc = models.FileField(upload_to=nice_user_folder_upload, verbose_name="Dataset")
推荐阅读
- ios - iPhone 后置摄像头无法正确对焦
- vuejs2 - 具有拖动功能的表格(mousedown/mouseup)
- android - 单击折叠工具栏顶部的按钮不起作用
- r - 纠正(或引导)两阶段 glm 的标准错误(下标越界)
- tbb - Oneapi致命错误:比较:系统重启后没有这样的文件或目录
- c++ - 单击和双击的单个日志生成 C++
- css - SCSS变量和CSS变量的区别?
- c# - .Net core 3.1 简单视图返回内部服务器错误 500
- php - 带有电子邮件确认的 Wordpress 注册
- javascript - 如何使用带有If条件的javascript隐藏div标签