django - загрузить файл в определенную папку (названную в честь поля из пользовательского профиля) - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть userprofile, в котором записано имя пользователя и группа, в которую назначен пользователь.Я хочу, чтобы загруженные файлы были сохранены в папке с именем группы.Папки уже выходят из корня носителя, файлы должны быть направлены в эти папки

Я попытался добавить путь к каталогу пользователя к моделям, это не решило мою проблему

models.py

class uploadmeta(models.Model):
    path = models.ForeignKey(Metadataform, verbose_name="ID", on_delete=models.PROTECT)
    doc = models.FileField(upload_to='', verbose_name="Dataset") 
    def get_absolute_url(self):
        return reverse('file_list', kwargs={'pk': self.pk})
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',]

1 Ответ

1 голос
/ 25 сентября 2019

Вы можете использовать аргумент 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")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...