Skip to main content
 首页 » 编程设计

python之如何以编程方式在 django oscar 中添加产品图片

2024年09月03日35hnrainll

我目前正在以编程方式将产品导入我的产品目录,但是,我无法为每个产品上传图片。这是我的代码的样子:

# 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) 

请您参考如下方法:

我认为您可以使用 File 来做到这一点类:

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() 

由于 ProductImage 与 Product 模型有 ForignKey 关系,并且 primary_image是Product模型中的一个方法,它从ProductImage模型中获取图像,并返回第一个(ProductImage对象在该字段中按display_order字段排序)