Django ImageField 上传到与 url 属性 报告的路径不同的路径?

Django ImageField Uploaded to Different Path than Reported by url property?

我想允许用户上传个人资料照片然后显示它们。

这是我的 model.py:

from django.db.models import CharField, ImageField, Model

class Eater(Model):
    name  = CharField(max_length = 30)
    image = ImageField(upload_to = 'images/eaters/')

    def __str__(self):
        return str(self.name)

这是我的 urls.py:

from django.conf             import settings  # settings is an object, not a module, so you can't import from it. :(
from django.conf.urls.static import static
from django.urls             import path
from .views                  import EaterView, IndexView, post, sudo

app_name    = 'socialfeedia'
urlpatterns = [
    path('',      IndexView.as_view(), name = 'index')
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  # Static returns a list of path, not a path itself.

这是我的settings.py的结尾:

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR.joinpath('media/')

这是我的index.html中的一行:

<img class="post-profile-picture" src="{{ post.eater.image.url }}" alt="?"/>

我已成功将文件上传到此字段 - 它存储在:

mysite/media/images/eaters/test_picture_64.jpg

如果我在这里访问,图像加载成功:

http://127.0.0.1:8000/socialfeedia/media/images/eaters/test_picture_64.jpg

然而,在我生成的文件中显示的 img 是这样的:

<img class="post-profile-picture" src="/media/images/eaters/test_picture_64.jpg" alt="?">

此文件无法解析 - 我只看到 ?alt)。我应该使用其他东西来获取文件的正确路径吗?也许是这样的?

{% media post.eater.name %}

(除了据我所知不存在 media 这样的东西...)

它应该在 url 的开头包含 socialfeedia/(应用程序名称),但它不是......它看起来不太像我所看到的到目前为止,Django 希望我手动硬编码...

我的猜测是移动

+ static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  # Static returns a list of path, not a path itself.

从你的应用urls.py文件socialfeedia到项目包下的全局urls.py文件,不要忘记设置命名空间 socialfeedia 在相应的网址中:

from django.conf import settings
from django.urls import path, include

from django.contrib import admin

[..]

urlpatterns = [

    [..]

    path('socialfeedia/', include('socialfeedia.urls', namespace='socialfeedia')),  # HERE

    path('admin/', admin.site.urls),  # Admin Area
]


# DEBUG = True
if settings.DEBUG:

    from django.conf.urls.static import static

    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

如果这对你有帮助,请告诉我。

src 的开头添加 {% get_media_prefix %} 对我有用,但我很确定这不是正确的解决方案。

<img class="post-profile-picture" src="{% get_media_prefix %}{{ post.eater.image.url }}" alt="?"/>