Я пытаюсь сделать динамический путь загрузки к модели FileField.Поэтому, когда пользователь загружает файл, Django сохраняет его на моем компьютере / media / (имя пользователя) / (path_to_a_file) / (имя файла).
Например, /media/Michael/Homeworks/Math/Week_1/questions.pdf или /media/Ernie/Fishing/Atlantic_ocean/Good_fishing_spots.txt
VIEWS
@login_required
def add_file(request, **kwargs):
if request.method == 'POST':
form = AddFile(request.POST, request.FILES)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.parent = Directory.objects.get(directory_path=str(kwargs['directory_path']))
post.file_path = str(kwargs['directory_path'])
post.file_content = request.FILES['file_content'] <-- need to pass dynamic file_path here
post.save()
return redirect('/home/' + str(post.author))
MODELS
class File(models.Model):
parent = models.ForeignKey(Directory, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
file_name = models.CharField(max_length=100)
file_path = models.CharField(max_length=900)
file_content = models.FileField(upload_to='e.g. /username/PATH/PATH/..../')
FORMS
class AddFile(forms.ModelForm):
class Meta:
model = File
fields = ['file_name', 'file_content']
Что я нашел, это былоно после проб и ошибок я не нашел способ сделать это.Таким образом, "upload / ..." будет post.file_path, который является динамическим.
def get_upload_to(instance, filename):
return 'upload/%d/%s' % (instance.profile, filename)
class Upload(models.Model):
file = models.FileField(upload_to=get_upload_to)
profile = models.ForeignKey(Profile, blank=True, null=True)