【问题标题】:django - upload file to a specific folderdjango - 将文件上传到特定文件夹
【发布时间】:2019-09-25 11:28:52
【问题描述】:

我有一个用户配置文件,其中包含用户名和用户分配到的组。我希望将上传的文件保存在组名文件夹下。文件夹已经存在于媒体根目录,文件应该被路由到这些文件夹

我通过给出的解决方案解决了这个问题。现在,用户名在上传页面上显示为下拉列表。我只想显示记录的用户名或排除甚至显示它

models.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

view.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')

forms.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',]

【问题讨论】:

标签: django file-upload


【解决方案1】:

您可以在FileField 中使用upload_to 参数。 它接受一个字符串,表示您要存储文件的路径,或者您可以传入一个函数来添加更多详细信息。

来自文档的更多信息: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}"
    )

然后在uploadmetaFileField中使用 doc = models.FileField(upload_to=nice_user_folder_upload, verbose_name="Dataset")

【讨论】:

  • 这取决于您想要实现的目标:1 个 user_profile 可以有多个 uploadmeta,1 个上传 meta 链接到一个 userprofile => 定义 uploadmeta 内部的关系。如果是相反的,请将其放在用户配置文件中。
  • 我收到此错误:“NoneType”对象没有属性“组”
  • 使用模型中定义的大写字母组
  • 在我评论得到同样的错误之前先尝试过
  • 我已经添加了上传视图和 form.py。你想看哪个模板?
猜你喜欢
  • 2018-10-23
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多