【问题标题】:Django using media (uploading files and adding them to templates)Django 使用媒体(上传文件并将它们添加到模板)
【发布时间】:2015-12-15 23:22:37
【问题描述】:

我正在尝试学习如何在 Django 中上传文件并在模板中使用它们。 我的目标是创建带有 multiuplad 字段的帖子表单,但我从简单的事情开始。我试图升级单个文件并在模板中添加指向这些文件的链接。这就是我到目前为止所做的:

型号:

class Adds(models.Model):
author = models.ForeignKey(User, verbose_name=u"Autor postu", blank=True, null=True)
image = models.FileField(upload_to='photos/')


def get_absolute_url(self):
    return settings.MEDIA_ROOT+"\%s" % self.image.name

我添加了函数 get_absolute_url 来获取添加了 MEDIA_ROOT 的 url。它不起作用,因为 MEDIA_ROOT 路径部分带有“\”,而 res 用“/”分隔。那是第一个问题如何使此功能正常工作。

我正在添加这样的链接<a href="{{plik.get_absolute_url}}">{{plik.get_absolute_url}}</a> 但我读到了 url 函数,所以我尝试了类似 <a href="{{plik.image.url}}">{{plik.image.url}}</a>但它返回的 url 没有 MEDIA_ROOT 部分,所以只有“upladed_to_name/file_name”。

设置中的我的 MEDIA_ROOT:

MEDIA_ROOT= os.path.join(os.path.dirname(BASE_DIR), "static_env", "my_static", "media")

在 shell 中我有这样的东西:

In [1]: from voiceManaging.models import Pracownik

In [2]: i=Pracownik.objects.get(pk=1)

In [3]: i.zdjecie.url
Out[3]: 'photos/mama_0SADn31.jpg'

In [4]: i.zdjecie.path
Out[4]: u'E:\\Django\\Projects\\KCKAPP\\static_env\\media\\photos\\mama_0SADn31.
jpg'

【问题讨论】:

  • 你能添加你定义的MEDIA_ROOT吗?
  • 您使用的是什么媒体存储类?如果您不确定,请在您的设置中输入DEFAULT_FILE_STORAGE
  • 我的设置中没有这个静态。所以我的 DEFAULT_FILE_STORAGE 应该和 MEDIA_ROOT 一样?

标签: python django templates upload


【解决方案1】:

因为您使用的是默认的 FileSystemStorage 类,如果您在设置中定义了 MEDIA_URL,则存储类可以使用该设置为您上传的文件构建一个 URL,并使用 .url 构建相应的文件名属性。

所以用你的例子;

class Adds(models.Model):
    author = models.ForeignKey(User, blank=True, null=True)
    image = models.FileField(upload_to='photos')

为了说明属性以及它们各自对 FieldField 的作用,请看一下这个;

>>> add = Adds.objects.get(author="Mark")
>>> add.image
<FileField: mark.jpg>
>>> car.photo.name
'photos/mark.jpg'
>>> add.image.path
'/media/photos/mark.jpg'
>>> add.image.url
'http://media.example.com/photos/mark.jpg'

所以MEDIA_URL 应该是您的网络服务器配置为提供存储在MEDIA_ROOT 中的文件的 URL。

【讨论】:

  • 好的,但是如何将那些“\”字符更改为“/”。文档声称 ulr() 应该返回带有 MEDIA_ROOT 的 url。所以我认为应该有任何方法来使用这个 MEDIA_ROOT。
  • @Max 我已经简化了默认 FileSystemStorage 类的答案,它可以很好地与 MEDIA_ROOTMEDIA_URL 配合使用,让您只需执行 add.image.url 即可获取图像的完整 URL .
猜你喜欢
  • 2016-02-21
  • 2019-07-01
  • 2010-10-01
  • 2011-04-11
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2020-11-29
  • 2012-10-05
相关资源
最近更新 更多