【问题标题】:How to programatically add product images in django oscar?如何以编程方式在 django oscar 中添加产品图片?
【发布时间】:2019-11-01 16:57:15
【问题描述】:

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

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

【问题讨论】:

    标签: python django image django-oscar


    【解决方案1】:

    我认为你可以使用 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()
    

    由于ProductImageProduct模型有ForignKey关系,而primary_imageProduct模型中的一个方法,它从ProductImage模型中获取图像,并返回第一个(ProductImage按@排序的对象987654335@该字段中的字段)

    【讨论】:

    • 感谢您的回答。我试过这个,但产品图像仍然没有显示在 django-oscar 管理仪表板中。我仍然收到“图片不可用”占位符。
    • 它可能是。我正在使用相对路径,并且我已将图像文件夹复制粘贴到 1) 项目根目录 2) 旁边的导入脚本 3) 媒体文件夹下 4) 媒体/图像文件夹下。顺便说一句,我使用的是 django-oscar Product 类的未修改版本
    • 我使用项目根目录的相对路径测试了代码。
    • @BB 我还添加了关于如何使用产品图片的代码 sn-p
    • 谢谢! ProductImage 工作就像一个魅力。图像现在显示在仪表板和站点中。在 settings.py 中设置 OSCAR_MISSING_IMAGE_URL 还允许我为丢失的图像设置自定义占位符图像。
    猜你喜欢
    • 2014-05-11
    • 2015-07-12
    • 2016-03-14
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2021-07-01
    相关资源
    最近更新 更多