Django-Oscar Невозможно настроить ProductCreateUpdateView и ProductForm - Traceback: ProductForm.__init__() отсутствует 1 необходимый позиционный аргумент

Я работаю над веб-магазином, используя Django-Oscar. Я хочу настроить страницу, которая создает новый продукт, и показывать на ней различные наборы атрибутов в зависимости от типа металла продукта (который был выбран до создания этой страницы - см. рисунок ниже).

enter image description here

Но я получаю отслеживание ProductForm.__init__() missing 1 required positional argument: 'metal'.

Желаемый выход:

enter image description here

Traceback

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.10/contextlib.py", line 79, in inner
    return func(*args, **kwds)
  File "/usr/local/lib/python3.10/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/oscar/apps/dashboard/catalogue/views.py", line 218, in dispatch
    resp = super().dispatch(
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/edit.py", line 190, in get
    return super().get(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/edit.py", line 133, in get
    return self.render_to_response(self.get_context_data())
  File "/usr/local/lib/python3.10/site-packages/oscar/apps/dashboard/catalogue/views.py", line 274, in get_context_data
    ctx = super().get_context_data(**kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/edit.py", line 66, in get_context_data
    kwargs['form'] = self.get_form()
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/edit.py", line 33, in get_form
    return form_class(**self.get_form_kwargs())

Exception Type: TypeError at /dashboard/catalogue/products/create/earrings/gold/diamond
Exception Value: ProductForm.__init__() missing 1 required positional argument: 'metal'

Ссылка на Oscar Code: https://github.com/django-oscar/django-oscar/tree/master/src/oscar

Виды

Формы

Модели

from operator import xor
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError

from oscar.core.utils import slugify
from oscar.apps.catalogue.abstract_models import AbstractProductAttribute, AbstractProduct
from oscar.models.fields import AutoSlugField

class ProductAttribute(AbstractProductAttribute):
    """
    Subclass of the AbstractProductAttribute class, adding metal and primary_gemstone fields.
    """
    metal = models.ForeignKey(
        'catalogue.Metal', on_delete=models.PROTECT, related_name='product_attribute',
        verbose_name='Metal Type', blank=True, null=True)

    primary_gemstone = models.ForeignKey(
        'catalogue.Gemstone', on_delete=models.PROTECT, related_name='product_attribute',
        verbose_name='Primary Gemstone Type', blank=True, null=True)

    common_attribute = models.BooleanField(verbose_name='Common Attribute (Y/N)')

    def get_absolute_url(self):
        return reverse('dashboard:attribute_detail', args=[str(self.id)])

    def clean(self):
        super().clean()

        if (
                (
                        self.common_attribute and
                 (self.metal or self.primary_gemstone)
                )
                or
                (
                        not self.common_attribute and
                 not xor(bool(self.metal), bool(self.primary_gemstone))
                )
        ):

                raise ValidationError(_("Product Attribute can belong to exactly one category: "
                                        "Metal, Gemstone or Common Attribute."))


class Product(AbstractProduct):
    """
    Subclass of the AbstractProduct class, adding metal and primary_gemstone fields.
    """
    metal = models.ForeignKey(
        'catalogue.Metal', on_delete=models.PROTECT, related_name='product',
        verbose_name='Metal Type', null=True)

    primary_gemstone = models.ForeignKey(
        'catalogue.Gemstone', on_delete=models.PROTECT, related_name='product',
        verbose_name='Primary Gemstone Type', null=True)

    def get_metal_type(self):
        """
        Return a product's metal type. Child products inherit their parent's.
        """
        if self.is_child:
            return self.parent.metal
        else:
            return self.metal
    get_metal_type.short_description = _('Metal type')
Вернуться на верх