Django-Oscar Невозможно настроить ProductCreateUpdateView и ProductForm - Traceback: ProductForm.__init__() отсутствует 1 необходимый позиционный аргумент
Я работаю над веб-магазином, используя Django-Oscar. Я хочу настроить страницу, которая создает новый продукт, и показывать на ней различные наборы атрибутов в зависимости от типа металла продукта (который был выбран до создания этой страницы - см. рисунок ниже).
Но я получаю отслеживание ProductForm.__init__() missing 1 required positional argument: 'metal'
.
Желаемый выход:
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')