Я не могу показать изображения в 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.

Вернуться на верх