#django
#django
Вопрос:
Я пытаюсь создать интернет-магазин с помощью Django. Я хочу добавить фотографии товаров, но Django по какой-то причине их не видит. Пожалуйста, помогите решить проблему.
вот settings.py
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
'../static/products/media/product_images/',
)
models.py
from django.db import models
# Create your models here.
class Product(models.Model):
name = models.CharField(max_length=70, blank=True, null=True, default=None)
price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
description = models.TextField(blank=True, null=True, default=None)
short_description = models.TextField(blank=True, null=True, default=None)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return "%s, %s" % (self.price ,self.name)
class Meta:
verbose_name = 'Товар'
verbose_name_plural = 'Товары'
class ProductImage(models.Model):
product = models.ForeignKey(Product, blank=True, null=True, default=None, on_delete=models.CASCADE)
image = models.ImageField(upload_to='static/media/product_images/')
is_active = models.BooleanField(default=False)
is_main = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return "%s" % self.id
class Meta:
verbose_name = 'Фотография'
verbose_name_plural = 'Фотографии'
главная urls.py файл
from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('online_shop.urls', namespace='online_shop')),
path('', include('products.urls', namespace='products')),
path('', include('orders.urls', namespace='orders')),
]
шаблон html
{% extends 'online_shop/base.html' %}
{% load static %}
{% block content %}
<section>
<div class="top-section">
<img src="{% static 'img/clem.png' %}" class="img-fluid">
</div>
</section>
<section>
<div class="container">
<div class="row">
{% for product_image in product_images %}
<div class="col-lg-3">
<div class="product-item">
<div>
<img src="{{product_image.image}}" alt="" class="img-fluid">
</div>
<h4>{{product_image.product.name}}</h4>
<p>{{product_image.product.description|truncatechars_html:80 }}</p>
<div class="price">
{{product_image.product.price}} ГРН
</div>
<div class="add-to-card">
<button class="btn btn-success">
Добавить в корзину
</button>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</section>
{% endblock content %}
Комментарии:
1. Вы не упомянули
STATIC_URL
в своих настройках иSTATIC_ROOT
не указали путь, который ведет к «staticfiles»2. @Niladry Kar, он даже
t help. Now doesn
не видит другие изображения3. Добавьте
static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
с вашимurlpatterns
в свой urls.py . проверьте документы docs.djangoproject.com/en/2.2/howto/static-files4. Привет @РусланШамсутдинов, вы получаете ошибку, потому что вы получаете полный путь к изображению. это должно быть
127.0.0.1:8000/static/products/media/product_images/..
, а не то, которое показано на изображении ошибки. Попробуйте отладить, как вы получаете весь этот путь вместо желаемого.5. @Sam Проблема в том, что я не записал абсолютный путь к файлам. Я не понимаю, откуда берется этот абсолютный путь
Ответ №1:
Возможно, вам потребуется внести некоторые изменения
settings.py
# prefix used in static files path rendering
STATIC_URL = '/static/'
# store static files once execute python manage.py collectstatic
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
# directories where static files are stored in the development environment
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
# prefix used upon uploaded images
MEDIA_URL = '/media/'
# where uploaded images should save
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
urls.py
# lets you have the ability to view images even in development environment
if settings.DEBUG:
urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Обновить:
Поскольку вы используете static/media/product_images/
в качестве пути загрузки, загруженные файлы будут сохранены в
project-root-dir/media/static/products/media/product_images
Надеюсь, это поможет!
Комментарии:
1. к сожалению, это не
2. хорошо, какой шаблон URL, похоже, отсутствует? загрузите новое изображение с вышеуказанными настройками, оно должно работать
Ответ №2:
вы можете сделать это, добавив следующий фрагмент в свой urls.py
from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('online_shop.urls', namespace='online_shop')),
path('', include('products.urls', namespace='products')),
path('', include('orders.urls', namespace='orders')),
] static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Комментарии:
1. это не помогает
2. попробуйте это simpleisbetterthancomplex.com/tutorial/2016/08/01/…