Я не могу показать изображения в django
Не могу найти изображение для отображения в django Я не могу понять, почему это
Я думаю, что что-то с моим setup.py, потому что я не смог найти MEDIA_URL и MEDIA_ROOT там, но я должен был бы Я не знаю, как направить программу на static/images/defaul.jpg на самом деле, и я прохожу курс, который сделал именно то, что я сделал, но он продолжает говорить, что не может найти изображение
Итак, мне нужна ваша помощь, ребята
вот мои коды
models.py
from django.db import models
# Create your models here.
from django.db import models
import uuid
# null is for database and blank is for django
# auto_now_add automatically add the date and the time that a object of this model created
# Use it to override the id cause django automatically create id for any object
# Use uuid and unique to make 16 chars id and unique ids
# Use primary key to use it as primary key in database
class Project(models.Model):
objects = None
title = models.CharField(max_length=200)
description = models.TextField(null=True, blank=True)
image = models.ImageField(null=True, blank=True, default='default.jpg')
demo_link = models.CharField(null=True, blank=True, max_length=2000)
source_link = models.CharField(null=True, blank=True, max_length=2000)
created = models.DateTimeField(auto_now_add=True)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
tag = models.ManyToManyField('Tag', blank=True)
total_vote = models.IntegerField(default=0, null=True, blank=True)
vote_ratio = models.IntegerField(default=0, null=True, blank=True)
def __str__(self):
return self.title
class Review(models.Model):
VOTE = (
('up', 'Up Vote'),
('down', 'Down Vote'),
)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
body = models.TextField(null=True, blank=True)
value = models.CharField(max_length=200, choices=VOTE)
created = models.DateTimeField(auto_now_add=True)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
def __str__(self):
return self.value
class Tag(models.Model):
name = models.CharField(max_length=200)
created = models.DateTimeField(auto_now_add=True)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
def __str__(self):
return self.name
urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("projects.urls"))
]
urlpatterns += static(settings.MEDIA_ROOT, document_root=settings.MEDIA_ROOT)
html файл
{% include 'navbar.html' %}
<img src="{{obj.image.url}}">
{% for tag in obj.tag.all %}
<span style="border:1px solid grey">{{tag}}</span>
{% endfor %}
<hr>
<h5>Description</h5>
<p>{{obj.description}}</p>
{% include 'footer.html' %}
setting.py
views.py
from django.shortcuts import render, redirect
# Create your views here.
from django.http import HttpResponse
from .models import Project
from .forms import ProjectForm
def projects(request):
objs = Project.objects.all()
context = {"projects": objs}
return render(request, 'projects/project.html', context)
def dynamic(request, text):
obj = Project.objects.get(id=text)
return render(request, 'projects/single-project.html', {'obj': obj})
def createproject(request):
form = ProjectForm()
if request.method == 'POST':
form = ProjectForm(request.POST)
print(request.POST)
if form.is_valid():
form.save()
return redirect('projects')
context = {'form': form}
return render(request, 'projects/projectform.html', context)
def updateproject(request, pk):
project = Project.objects.get(id=pk)
form = ProjectForm(instance=project)
if request.method == 'POST':
form = ProjectForm(request.POST, instance=project)
if form.is_valid():
form.save()
return redirect('projects')
context = {'form': form}
return render(request, 'projects/projectform.html', context)
def deleteproject(request, pk):
project = Project.objects.get(id=pk)
if request.method == 'POST':
project.delete()
return redirect('projects')
context = {'object': project}
return render(request, 'projects/delete_project.html', context)
Traceback
В вашем settings.py
вы должны добавить MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
.
Также в верхней части вашего template
вы должны добавить {% load static %}
Похоже, есть два варианта:
default.jpg является СТАТИЧЕСКИМ файлом
В таком случае это неправильный способ показать это
<img src="{{obj.image.url}}">
Возможный путь - примерно такой
{% load static %}
{% if obj.image %}
<img src="{{obj.image.url}}">
{% else %}
<img src="{% static 'images/default.jpg' }">
{% endif %}
и удалите default из определения модели image = models.ImageField(null=True, blank=True, default='default.jpg')
- пусть это будет null.
Обратите внимание, также вы можете определить опцию ImageField upload_to для лучшего управления медиа файлами.
В этой опции эти параметры управляют поведением:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
...
urlpatterns += static(settings.STATIC_ROOT, document_root=settings.STATIC_ROOT)
STATICFILES_DIRS в настоящее время используется неправильно: нет причин отмечать один и тот же каталог дважды как целевую папку статических файлов куда они должны быть собраны во время выполнения команды collectstatic
и одну из исходных папок куда они должны быть собраны (для этого и существует STATICFILES_DIRS).
default.jpg - это МЕДИА файл
Тогда шаблон в порядке. А эти настройки управляют поведением:
MEDIA_URL = '/images/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/images')
...
urlpatterns += static(settings.MEDIA_ROOT, document_root=settings.MEDIA_ROOT)
MEDIA_ROOT здесь используется неправильно: он не должен указывать на тот же каталог, где хранятся статические файлы. Файлы Media - это файлы, загруженные пользователями (или администраторами) во время использования вашего приложения. Вы не знаете, сколько файлов, насколько они малы или велики, как они будут названы. В то время как static являются частью вашего проекта, частью ваших исходников. Поэтому если вы поместите их в одну папку, то пользователи смогут перезаписать ваши css, js и jpg файлы, у вас, вероятно, возникнут проблемы при развертывании проекта. Очистка или переименование каталога уже не поможет - пользовательские файлы уже там. Возникнут проблемы с резервным копированием, миграцией, шардингом и т.д.
В этом случае ваш default.jpg
хранится в неправильном месте. Теперь вам нужно поместить его в каталог файлов пользователя (где-нибудь внутри MEDIA_ROOT) и помнить, что он не будет развернут, когда вы развернете проект на другом сервере.
Вы можете решить эту проблему с помощью симлинков или псевдонимов в конфигурации Nginx - потому что в конечном итоге и статические, и медиа файлы "должны" обслуживаться веб-сервером , а не приложением Django.