【问题标题】:Django media file path is incorrect, missing a directoryDjango 媒体文件路径不正确,缺少目录
【发布时间】:2018-01-16 10:34:36
【问题描述】:

当前使用 Django 1.9。 我的模型中的图像文件正在正确上传到

项目\媒体\FILEPATH.jpg

但是,图像正在尝试使用不带 \media 的文件路径显示。例如,当我在浏览器中访问我的本地主机 http://127.0.0.1:8000/media/FILEPATH.jpg 时,我得到一个 404,因为 Django 的 get 请求正在寻找:

项目\FILEPATH.jpg

我如何让 django 使用 \media\ 正确地提供我的媒体文件?


如果可能有用,请提供更多信息:
设置.py:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.dirname(os.path.join(BASE_DIR, 'media'))

型号:
image = models.ImageField(upload_to='media', blank='true')

project urls.py 根据文档,我在 urlpatterns 之后有以下内容:

static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

感谢您的帮助!

模型.py

class Post(models.Model):
  ptype = models.ForeignKey('blog.Type', related_name='posts')
  title = models.CharField(max_length = 100)
  text = models.TextField()
  published_date = models.DateTimeField(default=timezone.now)

  def __str__(self):
    return self.title
class Image(models.Model):
  post = models.ForeignKey('blog.Post', related_name='images')
  image = models.ImageField(upload_to='media', blank='true')

views.py

class Posts(generic.ListView):
  model = Post
  context_object_name = 'posts'
  template_name = 'blog/posts.html'

posts.html

{% extends "blog/base.html" %}
{% block content %}

{% for post in posts %}
  <p><a href = "{% url 'blog:postdetail' pk=post.pk %}">{{post.title}}</a></p>
  <p>{{post.text}}</p>
  {% for image in post.image_set.all %}
    <img src="{{ image.image.url }}">
  {% endfor %}
{% endfor %}
{% endblock %}

【问题讨论】:

  • 发布 html 部分。会不会是您忘记在src 属性中添加.url?例如:&lt;img src="{{ user.userprofile.image.url }}"&gt;
  • @hansTheFranz 我为这个问题添加了更多上下文。感谢您的回复。
  • 我可以想象{% for image in post.image_set.all %} 中的关键字image 会混淆Python,我就简单地称它为x。当您使用&lt;img src="{{ image.image.url }}"&gt; 时,第一个image 指的是四个循环变量,而不是您定义的模型。或者至少我认为问题可能存在。如果您将脚循环中的image 更改为x 会发生什么(只是在src 部分中没有)以及当您不删除for 循环时会发生什么?网址正确吗?
  • @hansTheFranz 在对您的建议进行了更多修改后,我已经使用以下代码显示图像: {% for x in post.images.all %} {% endfor %} 感谢您的帮助!我真的不明白为什么会这样,显然我的媒体文件路径是/media/media/sav2017.jpg 而不仅仅是/media。但我会进一步调查。再次感谢。至少现在它正在工作,我只需要弄清楚为什么。
  • 是的,没问题,很高兴能帮助别人开始 :)

标签: python django django-models


【解决方案1】:

好的

当你在模型上声明上传时,Django 会自动检测到你的媒体路径是 BASE_DIR/media,当你在模型上的 upload_to 中放置一些东西时,你声明这个图像必须保存在 BASE_DIR/media/something

示例:如果我想将用户的图像保存到媒体中,我必须在模型上进行此操作

  image = models.ImageField(upload_to='users/', blank='true')

我的图像将保存在 localhost/media/users/FILEPATH.jpg

media/ 之后的所有这些 url 都保存在您的“image”字段中,因此您的 image 字段将只显示“users/FILEPATH.jpg”而不是 localhost/media/

这就是为什么你需要在你的 src 中写 /media/

 <img src="/media/{{ image.image }}">

如果您将图像保存在名为“图像”的字段中,则不需要 .url。

试试看。

【讨论】:

  • 我明白你在说什么。 upload_to 属性已经识别出媒体的位置,这就是为什么我无法弄清楚我的路径,因为它正在搜索 /media/media。我已经更改了我的 upload_to 以包含一个更有意义的子目录。谢谢你的帮助!!!!
猜你喜欢
  • 2013-09-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 2021-09-23
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多