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

Python Django ImageField上载到与url属性报告的路径不同的路径?,python,django,django-templates,imagefield,Python,Django,Django Templates,Imagefield,我想允许用户上传个人资料图片,然后显示它们 这是我的型号.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(sel

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

这是我的型号.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)
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.
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR.joinpath('media/')
<img class="post-profile-picture" src="{{ post.eater.image.url }}" alt="?"/>
这是我的URL.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)
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.
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR.joinpath('media/')
<img class="post-profile-picture" src="{{ post.eater.image.url }}" alt="?"/>
这是我的设置的末尾。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)
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.
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR.joinpath('media/')
<img class="post-profile-picture" src="{{ post.eater.image.url }}" alt="?"/>
下面是我的index.html中的一行:

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)
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.
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR.joinpath('media/')
<img class="post-profile-picture" src="{{ post.eater.image.url }}" alt="?"/>
如果我在此处访问,图像将成功加载:

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="?">
(据我所知,
媒体
这类东西不存在除外…)

它应该包括
socialfeedia/
(应用程序名称)在url的开头,但它不是。。。到目前为止,我对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
文件,不要忘记在相应的URL中设置名称空间
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\u media\u prefix%}
对我很有效,但我很确定这不是正确的解决方案

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


谢谢!是的,你说得对。现在我回头看,我可以看到所有我看到的人们使用
static()
的例子都在
urls.py
文件中提到
admin/
,因此它们应该在project/site/main
urls.py
文件中,而不是应用程序的
urls.py
文件中。我一定会在将来与Django合作时注意到这种情况。这可能奏效了——我没有尝试过。另一个答案很有效,感觉是“正确”的方法。