使用模板标签找不到Django映像



我已经有很多天了,所有提供的解决方案还没有帮助我。如果我使用模板变量{{userprofile.photo.url}}(结果是alt文本),我要显示的图像配置文件将不会显示,但是当我将像这样的图像的路径放置时,它确实可以工作:/仪表板/媒体/仪表板/photo/profils/user.png。

我试图调试,看来URL很好,但给出的结果是:

[27/Nov/2017 13:55:07] "GET /dashboard/ HTTP/1.1" 200 44757
Not Found: /media/dashboard/photos/profils/user.png
[27/Nov/2017 13:55:07] "GET /media/dashboard/photos/profils/user.png HTTP/1.1" 404 2295

这里的文件:

项目的结构:

project_dir/
 dash-app/
    __init__.py
    settings.py
    urls.py
    wsgi.py
 dashboard/
    __init__.py
    admin.py
    app.py
    forms.py
    models.py
    urls.py
    views.py
    ...
  templates/
    dashboard/
       index.html
       ...
  static/
    dashboard/
      images/
         logo9.png
         ...
  media/
    dashboard/
      photos/
        profils/
           user.png
           ...

在urls.py上:

from django.conf.urls import url
from dashboard import models
from dashboard import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
    url(r'^$', views.index, name='index'),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

在settings.py上:

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "dashboard", "static")
#dashboard/media/
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media", "dashboard")

在型号上:

from django.core.files.storage import FileSystemStorage
image_storage = FileSystemStorage(
    # Physical file location ROOT
    location='{0}/'.format(settings.MEDIA_ROOT),
    # Url for file
    base_url='{0}/dashboard/'.format(settings.MEDIA_URL),
)
def image_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/dashboard/picture/<filename>
    return 'photos/profils/{0}'.format(filename)
def logo_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/dashboard/picture/<filename>
    return 'photos/logos/{0}'.format(filename)
...
   # Photos
    photo = models.ImageField(blank=True, 
                              upload_to=image_directory_path, 
                              storage=image_storage)
    # Logo de l'activité
    photo = models.ImageField(null=True, 
                              upload_to=logo_directory_path, 
                              storage=image_storage)

在Views.py上:

def index(request):
    connected = models.UserProfile.objects.get(user=request.user)
    print(connected.photo.url)
    context={
        'userprofile':connected,
    }    
    return render(request, 'dashboard/index.html', context)

在index.html上:

 <!-- menu profile quick info -->
  <div class="profile clearfix">
    <div class="profile_pic">
    {% if userprofile.photo %}
        <img src="{{ userprofile.photo.url }}" alt="User" class="img-circle profile_img">
    {% else %}
        <img src="media/dashboard/photos/profils/user.png" alt="..." class="img-circle profile_img">
    {% endif %}
    </div>
    <div class="profile_info">
      <span>Bienvenu,</span>
      <h2>{{ userprofile }}</h2>
    </div>
  </div>
  <!-- /menu profile quick info -->

我正在使用Python 3和Django 1.11.5感谢Tou的帮助!

编辑:我已经在私人导航上打开了该应用程序以重新加载,看看是否有缓存上的某个问题,并且知道我发现什么都不可用,也不可用: {{ userprofile.photo.url|slice:"1:" }}media/dashboard/photos/profils/user.png。是否可以重新加载>媒体的文件链接到该项目或类似的内容。因为如果将图像手动添加到文件夹或通过Django管理员接口上传,是否有区别?

已解决:我更改了以下行: MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media", "dashboard")MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media")

image_storage = FileSystemStorage( # Physical file location ROOT location='{0}/'.format(settings.MEDIA_ROOT), # Url for file base_url='{0}/dashboard/'.format(settings.MEDIA_URL), )

to

image_storage = FileSystemStorage( # Physical file location ROOT location='{0}/dashboard/'.format(settings.MEDIA_ROOT), # Url for file base_url='{0}/dashboard/'.format(settings.MEDIA_URL), )

在模型上定义一个将相对URL返回媒体文件的计算属性。

class CustomUser(models.Model):
...
   @property
   def photo_url(self):
       return '{}{}'.format(settings.MEDIA_URL, self.img)

然后在模板中使用此计算的属性:

{% if userprofile.photo %}
    <img 
       src="{{ userprofile.photo_url }}"
       alt="User" 
       class="img-circle profile_img"
    >
{% else %} 

如果您正在开发中运行,则可以在项目URL中注册媒体文件的路线:

urlpatterns = [
   ...
] + static.static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

否则,请考虑将媒体文件上传到诸如Amazon S3之类的数字资产管理系统或编写服务器规则以服务您的资产。

已解决:

我更改了这些行: MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media", "dashboard")MEDIA_ROOT = os.path.join(BASE_DIR, "dashboard", "media")

image_storage = FileSystemStorage(
          # Physical file location ROOT
          location='{0}/'.format(settings.MEDIA_ROOT),
          # Url for file
          base_url='{0}/dashboard/'.format(settings.MEDIA_URL),
      )

to

image_storage = FileSystemStorage(
          # Physical file location ROOT
          location='{0}/dashboard/'.format(settings.MEDIA_ROOT),
          # Url for file
          base_url='{0}/dashboard/'.format(settings.MEDIA_URL),
      )