Python 定义用户在Django中保存上传文件的文件路径
考虑一下我们是否有一个表单,其中包含一个字段,用户可以像这样上传文件:Python 定义用户在Django中保存上传文件的文件路径,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,考虑一下我们是否有一个表单,其中包含一个字段,用户可以像这样上传文件: class PoscastForm(forms.ModelForm): class Meta: fields = ("title", "message", "channel", "file", "tag") model = models.Podcast def __ini__(self, *args, **kwargs): user = kwargs.pop(
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 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)
以及播客模式:
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 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 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)
根据,可以在模型定义中定义文件路径
file = models.FileField(blank=True, null=True, default='', upload_to="your/path/")
此外,如果您定义了,则上载的文件将被发送到媒体根目录
的子目录,该子目录定义为上载到
。有关更多详细信息,请参阅文档
您还可以定义用户智能上传目录。从文件:
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)
def用户目录路径(实例,文件名):
#文件将上载到媒体\u ROOT/用户_/
返回'user{0}/{1}'。格式(instance.user.id,文件名)
#模型定义
file=models.FileField(上传到=用户目录路径)
根据,您可以在模型定义中定义文件路径
file = models.FileField(blank=True, null=True, default='', upload_to="your/path/")
此外,如果您定义了,则上载的文件将被发送到媒体根目录
的子目录,该子目录定义为上载到
。有关更多详细信息,请参阅文档
您还可以定义用户智能上传目录。从文件:
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)
def用户目录路径(实例,文件名):
#文件将上载到媒体\u ROOT/用户_/
返回'user{0}/{1}'。格式(instance.user.id,文件名)
#模型定义
file=models.FileField(上传到=用户目录路径)