Заявление о проблеме
Я работаю над формой django , где пользователи могут динамически добавлять/удалить colors , размеры и Images при добавлении продукта.
a продукт может иметь несколько цветов .
Каждый color < /strong> может иметь несколько размеров .
Каждый color может иметь множество изображений .
Пользователи должны иметь возможность динамически Добавить/удалить цвета, размеры и изображения с использованием javascript.
ожидаемое поведение
Нажмите «Добавить цвет» должна создать новую форму цвета с собственными размер размер и разделения изображений .
Нажмите "Добавить Размер " внутри цвета должен добавить новый размер только к этому конкретному цвету. Этот конкретный цвет.
Нажмите «Удалить цвет» должен удалить конкретный цветовой раздел.
, "добавить size" и "добавить image" кнопки не работают. Кнопки. Forms < /strong> (они существуют).
✔ Проверенные слушатели событий прикреплены с использованием console.log () < /code>.
✔ обеспечить клоненод (true) < /код> правильно копирует элементы.
✔ проверено на ошибки JavaScript в консоли (без ошибок синтаксиса). < /p>
django forms & formsets
forms (forms.py)
from django import forms
from django.forms import inlineformset_factory
from .models import VendorProduct, ProductColor, ProductSize, ProductImage, ColorImage
class ProductForm(forms.ModelForm):
class Meta:
model = VendorProduct
fields = ['title', 'category', 'base_price']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'category': forms.Select(attrs={'class': 'form-control'}),
'base_price': forms.NumberInput(attrs={'class': 'form-control'}),
}
class ProductColorForm(forms.ModelForm):
class Meta:
model = ProductColor
fields = ['color_name', 'color_code']
widgets = {
'color_name': forms.TextInput(attrs={'class': 'form-control'}),
'color_code': forms.TextInput(attrs={'class': 'form-control'}),
}
class ProductSizeForm(forms.ModelForm):
class Meta:
model = ProductSize
fields = ['size_name', 'stock', 'price_increment']
widgets = {
'size_name': forms.TextInput(attrs={'class': 'form-control'}),
'stock': forms.NumberInput(attrs={'class': 'form-control'}),
'price_increment': forms.NumberInput(attrs={'class': 'form-control'}),
}
class ProductImageForm(forms.ModelForm):
class Meta:
model = ProductImage
fields = ['image']
widgets = {
'image': forms.FileInput(attrs={'class': 'form-control'}),
}
class ColorImageForm(forms.ModelForm):
class Meta:
model = ColorImage
fields = ['image']
widgets = {
'image': forms.FileInput(attrs={'class': 'form-control'}),
}
javascript (dynamic.js) < /strong> < /h3>
document.addEventListener("DOMContentLoaded", function () {
// Initialize indexes
let colorIndex = parseInt(document.querySelector('[name="colors-TOTAL_FORMS"]')?.value) || 0;
let imageIndex = parseInt(document.querySelector('[name="images-TOTAL_FORMS"]')?.value) || 0;
function addColor() {
let colorContainer = document.getElementById("colorContainer");
let totalForms = document.querySelector('[name="colors-TOTAL_FORMS"]');
if (!totalForms) {
console.error("Management form for colors-TOTAL_FORMS not found!");
return;
}
function addSize(button) {
let sizeContainer = button.closest(".color-item").querySelector(".sizeContainer");
let sizeIndex = sizeContainer.querySelectorAll(".size-item").length;
function addImage() {
let imageContainer = document.getElementById("imageContainer");
let totalForms = document.querySelector('[name="images-TOTAL_FORMS"]');
if (!totalForms) {
console.error("Management form for images-TOTAL_FORMS not found!");
return;
}
[b] Заявление о проблеме [/b] Я работаю над формой [b] django [/b], где пользователи могут динамически добавлять/удалить [b] colors , размеры [/b] и [b] Images [/b] при добавлении продукта. [list] [*] a [b] продукт [/b] может иметь несколько цветов [b] [/b]. [*] Каждый [b] color < /strong> может иметь несколько размеров [/b]. [*] Каждый [b] color [/b] может иметь множество изображений . Пользователи должны иметь возможность динамически Добавить/удалить [b] цвета, размеры и изображения [/b] с использованием javascript. [/list] [b] ожидаемое поведение [/b] [list] [*] Нажмите «Добавить цвет» должна создать новую форму цвета с собственными размер [b] размер и разделения изображений [/b]. [*] Нажмите "Добавить Размер " внутри цвета должен добавить новый размер только к этому конкретному цвету. Этот конкретный цвет. [*] Нажмите «Удалить цвет» должен удалить конкретный цветовой раздел. [/list] [b] ток Проблема [/b] [list] [*] [b] только кнопка «Удалить цвет» работает. [/b] [*][code]"Add Color"[/code], "добавить size" и "добавить image" кнопки не работают. Кнопки. Forms < /strong> (они существуют).
✔ Проверенные слушатели событий прикреплены с использованием console.log () < /code>.
✔ обеспечить клоненод (true) < /код> правильно копирует элементы.
✔ проверено на ошибки JavaScript в консоли (без ошибок синтаксиса). < /p>
[b] django forms & formsets [/b] [h4] [b] forms (forms.py) [/b] [/h4] from django import forms from django.forms import inlineformset_factory from .models import VendorProduct, ProductColor, ProductSize, ProductImage, ColorImage
class ProductForm(forms.ModelForm): class Meta: model = VendorProduct fields = ['title', 'category', 'base_price'] widgets = { 'title': forms.TextInput(attrs={'class': 'form-control'}), 'category': forms.Select(attrs={'class': 'form-control'}), 'base_price': forms.NumberInput(attrs={'class': 'form-control'}), }
class ProductColorForm(forms.ModelForm): class Meta: model = ProductColor fields = ['color_name', 'color_code'] widgets = { 'color_name': forms.TextInput(attrs={'class': 'form-control'}), 'color_code': forms.TextInput(attrs={'class': 'form-control'}), }
class ProductSizeForm(forms.ModelForm): class Meta: model = ProductSize fields = ['size_name', 'stock', 'price_increment'] widgets = { 'size_name': forms.TextInput(attrs={'class': 'form-control'}), 'stock': forms.NumberInput(attrs={'class': 'form-control'}), 'price_increment': forms.NumberInput(attrs={'class': 'form-control'}), }
class ProductImageForm(forms.ModelForm): class Meta: model = ProductImage fields = ['image'] widgets = { 'image': forms.FileInput(attrs={'class': 'form-control'}), }
class ColorImageForm(forms.ModelForm): class Meta: model = ColorImage fields = ['image'] widgets = { 'image': forms.FileInput(attrs={'class': 'form-control'}), }
javascript (dynamic.js) < /strong> < /h3> document.addEventListener("DOMContentLoaded", function () { // Initialize indexes let colorIndex = parseInt(document.querySelector('[name="colors-TOTAL_FORMS"]')?.value) || 0; let imageIndex = parseInt(document.querySelector('[name="images-TOTAL_FORMS"]')?.value) || 0;
function addColor() { let colorContainer = document.getElementById("colorContainer"); let totalForms = document.querySelector('[name="colors-TOTAL_FORMS"]');
if (!totalForms) { console.error("Management form for colors-TOTAL_FORMS not found!"); return; }
function addSize(button) { let sizeContainer = button.closest(".color-item").querySelector(".sizeContainer"); let sizeIndex = sizeContainer.querySelectorAll(".size-item").length;
function addImage() { let imageContainer = document.getElementById("imageContainer"); let totalForms = document.querySelector('[name="images-TOTAL_FORMS"]');
if (!totalForms) { console.error("Management form for images-TOTAL_FORMS not found!"); return; }
Слушатели событий не были прикреплены правильно. Strong> JavaScript не использовал делегирование событий должным образом. [/b] [*] [b] Сценарий, необходимый для обработки как статических, так и динамически добавленных элементов. [/b] [/list]