【问题标题】:How to upload file or image from django oscar dashboard?如何从 django oscar 仪表板上传文件或图像?
【发布时间】:2019-06-25 06:51:44
【问题描述】:

所以,我尝试从 Django Oscar 中修改 ProductClass。 如果我尝试从 Django Rest API 上传图像,它工作正常,如下所示:

但是当我尝试从 Django Oscar 管理仪表板上传图片时,它总是返回 null。

这是我的模型:

这是我的看法:

下面是我的仪表板/目录/forms.py

我需要修改或扩展什么才能使用 Django Oscar 管理仪表板上传图片?

【问题讨论】:

    标签: python django django-models django-oscar


    【解决方案1】:

    由于您没有为自定义提供任何 views.py 预览,因此很难解释和解决您的问题。但我会解释如何分叉或自定义任何 django oscar 应用程序/模型/视图。

    为了自定义模型、视图和 url,您需要 fork 模型/视图所在的 Oscar 核心应用。然后你应该能够覆盖任何模型/视图类。

    派生/自定义应用程序的步骤:

    1. 如果您是第一次分叉 Oscar 应用,那么您必须创建一个根应用文件夹,其中所有分叉的应用都将存在:

      $ mkdir yourapps 文件夹 $ touch yourappsfolder/init.py

    2. 创建一个与 Oscar 应用具有相同“app-label”的 python 模块:

    例如:自定义 oscar.apps.catalogue 应用

    $ mkdir yourappsfolder/catalogue
    $ touch yourappsfolder/catalogue/__init__.py
    
    1. 如果 Oscar 应用有 models.py,那么您必须在本地应用中创建一个 models.py 文件。

      您的自定义模型放在这里

      从 oscar.apps.catalogue.models 导入 *

    注意:要自定义 Oscar 模型,您必须在导入 Oscar 模型之前添加自定义模型。然后,你的模型文件将在一个应用程序中有两个同名的模型,Django 只会使用第一个。

    例如:向产品模型添加活动字段:

    # yourappsfolder/catalogue/models.py
    from django.db import models
    from oscar.apps.catalogue.abstract_models import AbstractProduct
    class Product(AbstractProduct):
        active = models.BooleanField(default=False)
    from oscar.apps.catalogue.models import *
    
    1. 在您的本地应用程序中创建一个“admin.py”文件。

      yourappsfolder/catalogue/admin.py

      从 oscar.apps.catalogue.admin 导入 *

    2. 然后从 oscar/apps/catalogue 复制“迁移”目录并将其放入新的本地目录应用程序中。

    3. 通过在 INSTALLED_APPS 中将 Oscar 的应用替换为您自己的应用,将其添加为 Django 应用。

      settings.py

      从奥斯卡导入 get_core_apps 安装应用程序 = [ ..., # 你所有的非奥斯卡应用 ] + get_core_apps(['yourappsfolder.catalogue'])

    注意:get_core_apps([]) 将返回 Oscar 核心应用列表,否则如果您提供自定义应用列表,它们将替换 Oscar 核心应用。

    1. 最后,使用“makemigrations”管理命令创建迁移,并使用“migrate catalogue”管理命令应用迁移。然后,您可以看到产品模型中添加了一个新列。

    自定义 URL 的步骤:

    1. 按照上述自定义应用程序中描述的相同步骤进行操作。

    2. 在 Oscar 中,每个应用程序在“app.py”文件中都有自己的 URL,每个应用程序都带有一个具有“urls”属性的应用程序实例,用于访问应用程序的 URL 列表。

      • 修改“yourproject/urls.py”文件以包含 Oscar URL。

        从 django.conf.urls 导入包含,url 从 yourproject.app 导入应用程序 网址模式 = [ # 你的其他网址 url(r'',包括(application.urls)), ]

    3. 要将购物篮应用的 URL 从“basket”更改为“cart”,您需要通过创建其子类并覆盖“get_urls”方法来自定义根应用实例。

      你的项目/app.py

      来自 oscar 导入应用程序 类商店(app.Shop): def get_urls(self): 网址模式 = [ 网址(r'^cart/',包括(self.basket_app.urls)), # ... # 在此处重复 url ] 返回 url 模式 应用程序 = 商店()

    自定义或向应用添加视图的步骤:

    1. 按照上述自定义应用程序中所述的相同步骤进行操作。

    2. 在views.py文件中新建一个视图类或创建Oscar的视图子类:

    例如:向主页添加额外的上下文。

    from oscar.apps.promotions.views import HomeView as CoreHomeView
    class HomeView(CoreHomeView):
    
        def get_context_data(self, **kwargs):
            context = super(HomeView, self).get_context_data(**kwargs)
            context["latest_products"] = Product.objects.filter(
                parent=None).order_by('-date_created')
            return context
    

    请记住,您不需要在视图中从 django oscar 应用程序中导入 all(*)。

    我从 MicroPyramid 博客获得的帮助。

    【讨论】:

    • 嗨,我编辑了我的问题。我对如何扩展 django oscar 没有问题。我的问题是特定于图像的。因此,我在 ProductClass 上添加了新的 FileField,但是当我从 django oscar 仪表板保存 ProductClass 数据时它总是失败。
    【解决方案2】:

    你需要实现这个视图类来像上面描述的那样从 django oscar 仪表板上传 -

    class ProductCreateUpdateView(generic.UpdateView):
    

    它位于此处。

    oscar/apps/dashboard/catalogue/views.py
    

    【讨论】:

    • 我也已经这样做了,我这样做是为了在保存产品时删除其中一个表单集。我需要重写什么函数?
    • 我的问题发生在 ProductClass 而不是 Product
    【解决方案3】:

    Oscar 的ImageInput 是一个相当具体的小部件,仅用于处理一组图像 - 就像在产品编辑表单上一样。它依赖于 Javascript 在选择图像时正确填充输入字段的值。该 Javascript 不能在表单集之外工作。

    在这种情况下,您最好只使用默认小部件。

    如果您确实希望能够显示所选图像的预览(这是ImageInput 真正添加的所有内容),那么您将需要编写一个自定义小部件来执行此操作。这样做的相关 JS 在这里:https://github.com/django-oscar/django-oscar/blob/b627fa7954d284190cfe7c8c75da0528a6dd6bf7/src/oscar/static/oscar/js/oscar/dashboard.js#L7-L14

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2016-10-30
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多