Django如何从views.py指定上传到FileField的位置

时间:2017-09-20 13:54:53

标签: django django-models django-views

假设你有一个带有FileField的模型形式:

class Book(models.Model):
    book_title = models.CharField(max_length = 100, blank = False, null = False)
    book_teaser = models.FileField(blank = True, null = True)
    author = models.ForeignKey(related_name = 'books', blank = True, null = True)
    ...

class Author(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete = models.CASCADE, null = True, blank = True)
    ...

Book模型与User模型没有直接关系。如果您要在以下位置上传PDF文件:

user/books/  # app_name is books

如何在views.py中指定upload_to位置。文档展示了如何使用静态地址(对我来说不起作用)或者可调用来指定models.py中的上传位置:

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)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)

但是,与文档的示例不同,该模型没有直接的外键才能使用

instance.user.id

那么,您如何从views.py中指定上传位置,具体取决于用户在网站上查看的内容?

1 个答案:

答案 0 :(得分:0)

您可以使用instance.author.user.id,它应该可以正常工作。

在评论后修改

def user_directory_path(instance,request, filename):
    loggeduserid = request.user.id
    return 'user_{0}/{1}'.format(looggeduserid, filename)