Определите путь к файлу для сохранения загруженного файла пользователями в Django - PullRequest
0 голосов
/ 17 ноября 2018

Рассмотрим, есть ли у нас форма, которая содержит поле для загрузки файла пользователями, подобными этому:

class PoscastForm(forms.ModelForm):
    class Meta:
        fields = ("title", "message", "channel", "file", "tag")
        model = models.Podcast

    def __ini__(self, *args, **kwargs):
        user = kwargs.pop("user", None)
        super().__init__(*args, **kwargs)

        if user is not None:
            self.fields["channel"].queryset = (
                models.Channel.objects.filter(
                    pk__in = user.channels.value_list('channel__pk')
                )
            )

И модель подкаста:

class Podcast(models.Model):
    title = models.CharField(max_length=255, default='')
    user = models.ForeignKey(User, related_name="podcasts", 
on_delete=models.CASCADE, unique=False)
    created_at = models.DateTimeField(auto_now=True)
    channel = models.ForeignKey(Channel, related_name="podcasts", 
null=True, blank=True,
        on_delete=models.CASCADE)
    message = models.TextField(blank=True, null=True)
    message_html = models.TextField(editable=False)
    tag = models.ForeignKey('podcasts.Tag', related_name="podcasts", 
null=True, blank=True, on_delete=models.CASCADE)
    file = models.FileField(blank=True, null=True, default='')

Так, когда пользователь загружаетего прикрепленный файл он сохранит в корневой директории моего проекта!Как я могу изменить направление пути?Вид этой формы выглядит следующим образом:

class CreatePodcast(LoginRequiredMixin, SelectRelatedMixin, 
generic.CreateView):
    fields = ("title", "message", "channel", "file", "tag")
    model = models.Podcast

   def form_valid(self, form):
       self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

1 Ответ

0 голосов
/ 17 ноября 2018

Согласно документации , вы можете определить путь к файлу в определении модели

file = models.FileField(blank=True, null=True, default='', upload_to="your/path/")

Также, если вы определите MEDIA_ROOT , загруженные файлы будут отправлены в подкаталог MEDIA_ROOT, который определен как upload_to. Подробнее см. Документацию storage .

Также вы можете определить пользовательский каталог загрузки. Из документации:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

# model defination
file = models.FileField(upload_to=user_directory_path)
...