【问题标题】:I am having trouble in passing a specific image in my template from Django models我在从 Django 模型中传递模板中的特定图像时遇到问题
【发布时间】:2021-07-30 10:15:28
【问题描述】:

模型.py

class BaseLogo(models.Model):
logolabel = models.CharField(max_length = 100, null = False, blank = False)
logoimage = models.ImageField(null = False, blank = False)

def __str__(self):
    return self.logolabel

Views.py

def base(request):

baselogo = get_object_or_404(BaseLogo, pk=1)
context = {
  'baselogo': baselogo,
 }

return render(request, 'pages/base.html', context)

Settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS= [os.path.join(BASE_DIR, 'static')]

STATIC_ROOT = '/home/flababu/VCASite/staticfiles/'



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

MEDIA_URL = '/media/'

模板

<a class="nav-brand" href="{% url 'main-home' %}">
  <img src="{{ baselogo.logoimage.url }}" alt="VCAAT Logo" title="VCAAT Logo"
  style="width: 60px; height: 60px; float: left; margin-left: 20px; margin-right: 20px;"></a>

注意事项:

  1. 它在导航栏中
  2. 我有一个图库应用,我也有头像,所以我之前可以传递图片。
  3. 网站在pythonanywhere上传。
  4. 我在管理页面上传了一张图片

我不明白为什么我的图片(徽标)不会出现。

【问题讨论】:

  • Django 不在生产环境中提供媒体文件,因为它可能不安全且效率低下。您需要配置 nginx/apache/... 以提供媒体/静态文件。

标签: python django django-models django-views django-templates


【解决方案1】:

在你的 settings.py 中添加这 2 行

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

media root 用于告诉您的项目将媒体文件放在哪里,media url 用于告诉 django 将此文件夹(链接)用于链接(url),以便您可以在项目中使用它并显示图像,如果您不这样做'不要告诉 django 媒体 url,你无法显示来自媒体文件的图像

更新:

那就试试这个吧,这个代码是给我的项目的,和你想要的很相似

在模型类的 models.py 中

profileimage = ImageField(default="default.jpg", upload_to=your_desire_folder_path, blank=True)

你可以给它任何你想要的名字,它与媒体文件夹无关

【讨论】:

  • 我已经有了它们是我的settings.py,我会在上面添加它
  • 我试过了,还是一样,我的用户应用程序里也有这个,它工作正常,我不知道为什么它对这个不起作用,谢谢你帮助我!非常感谢
  • 好吧,我正在考虑如何解决这个问题,帮我试试这个,看看它是否有效 baselogo = BaseLogo.objects.all() 尝试使用 pk=1 而没有 pk=1 我'我仍在寻求解决这个问题
  • 您是否在主 urls.py 中添加了 + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)?
  • 是的,我已经在我的主要 urls.py 中有这个,我确实有预感,我认为这是因为我的 base.html 本身并没有真正的页面,我只使用我的base.html 以便我的其他页面可以继承它,因为它有我的导航栏、背景和页脚。也许我不应该为此使用 Views.py,但我不确定
【解决方案2】:

我的直觉是正确的,views.py 根本不是答案/问题。我在views.py 中删除了我的基础。我创建了一个新文件 custom_context_processor

custom_context_processor.py

from .models import BaseLogo


def base_renderer(request):

  baselogo = BaseLogo.objects.first()
  context = {
    'baselogo': baselogo,
   }


  return context

然后添加到我的

settings.py

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'pages.custom_context_processor.base_renderer',
        ],
    },
},
]

它现在按预期运行,事实证明,这是非常普遍的做法,感谢那些试图提供帮助的人!

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多