Как программно добавить изображения товара в django oscar? - PullRequest
2 голосов
/ 19 июня 2019

В настоящее время я программно импортирую товары в свой каталог товаров, однако у меня возникают трудности с загрузкой изображений для каждого товара.Вот как выглядит мой код:

# frobshop/custom_utils/product_importer.py

from oscar.apps.catalogue.models import Product
...

for product in my_product_import_list:
    ...
    product_entry = Product()
    product_entry.title = my_product_title
    product_entry.product_class = my_product_class
    product_entry.category = my_category
    product_entry.primary_image = "product_images/my_product_filename.jpg"
    product_entry.save()

Такие детали, как название продукта и класс продукта, успешно сохраняются при проверке с использованием сервера разработки, однако я не уверен, как настроить изображение для каждого продукта.

Вся папка product_images изначально находилась за пределами моего каталога media, но, поскольку я не получила никаких результатов, я скопировала и вставила всю папку моих изображений в каталог media, но все ещебез результатов.Я предполагаю, что пропущено довольно много шагов, и, возможно, существует соглашение о том, как размещать изображения в каталоге мультимедиа.Однако я не уверен, где найти эти шаги и соглашения.

Вот часть моего settings.py файла, который касается моих установленных приложений, медиа-каталога и статических файлов:

# frobshop/frobshop/settings.py

...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',

    'django.contrib.sites',

    'django.contrib.messages',
    'django.contrib.staticfiles',

    'django.contrib.flatpages',

    'compressor',
    'widget_tweaks',
] + get_core_apps(['custom_apps.shipping', 'custom_apps.payment', 'custom_apps.checkout'])

...


STATIC_ROOT = 'static'
STATIC_URL = '/static/'
MEDIA_ROOT = 'media'
MEDIA_URL = '/media/'

Для большей ясности вот мой urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
from oscar.app import application
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    url(r'^i18n/', include('django.conf.urls.i18n')),
    path('admin/', admin.site.urls),
    url(r'', application.urls),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

1 Ответ

2 голосов
/ 19 июня 2019

Я думаю, вы можете сделать это следующим образом, используя File class:

from django.core.files import File

for product in my_product_import_list:
    ...
    product_entry = Product()
    product_entry.title = my_product_title
    product_entry.product_class = my_product_class
    product_entry.category = my_category
    image = File(open("product_images/my_product_filename.jpg", 'rb'))
    product_entry.primary_image = image
    product_entry.save()

Обновление

вероятно, вам следует использовать OSCAR_MISSING_IMAGE_URL в настройках:

OSCAR_MISSING_IMAGE_URL = "product_images/my_product_filename.jpg"  # relative path from media root

В качестве альтернативы вы можете использовать ProductImage, например:

    from oscar.apps.catalogue.models import ProductImage

    product_entry = Product()
    product_entry.title = my_product_title
    product_entry.product_class = my_product_class
    product_entry.category = my_category
    product_entry.save()
    product_image = ProductImage()
    image = File(open("product_images/my_product_filename.jpg", 'rb'))
    product_image.original = image
    product_image.caption = "Some Caption"
    product_image.product = product_entry
    product_image.save()

As ProductImage имеет отношение ForignKey к Product модели, а primary_image - метод в модели Product, который берет изображение из модели ProductImage и возвращает первое (ProductImage объектов, упорядоченных по полю display_order в этом поле)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...