Django - Отображение дочерних элементов на основе родительских в кверисете ModelChoiceField

Я создал модели, каждая из которых основана на своем родителе. На формах я использовал ModelChoiceField. Когда пользователь выбирает элемент из поля выбора Category, в поле Subcategory должны отображаться только его дочерние элементы. А также после выбора подкатегории, в поле выбора ProductCategory должны отображаться дочерние элементы.

должно было быть что-то вроде этого

Но я получаю ошибку: TypeError: Field 'id' expected a number but got <django.forms.models.ModelChoiceField object at 0x7f3d1f9f0ac0>. Как я могу это улучшить?

models.py:

class Category(models.Model):
    name = models.CharField("Category Name", max_length=100, unique=True)
    link = models.CharField("Category Link", max_length=250)

    def __str__(self):
        return self.name

class Subcategory(models.Model):
    parent = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
    name = models.CharField("Sub-category Name", max_length=100, unique=True)
    link = models.CharField("Sub-category Link", max_length=250)

    def __str__(self):
        return self.name

class ProductCategory(models.Model):
    parent = models.ForeignKey(Subcategory, on_delete=models.CASCADE, null=True)
    name = models.CharField("Product-Category Name", max_length=100, unique=True)
    link = models.CharField("Product-Category Link", max_length=250)

    def __str__(self):
        return self.name

class ProductSubCategory(models.Model):
    parent = models.ForeignKey(ProductCategory, on_delete=models.CASCADE, null=True)
    name = models.CharField("Product-Sub-Category Name", max_length=100, unique=True)
    link = models.CharField("Product-Sub-Category Name", max_length=250)

    def __str__(self):
        return self.name
 

forms.py

class CategoryForm(forms.Form):
    category = forms.ModelChoiceField(queryset=Category.objects.all())
    subcategory = forms.ModelChoiceField(queryset=Subcategory.objects.filter(parent=category))
    prodcategory = forms.ModelChoiceField(queryset=ProductCategory.objects.filter(parent=subcategory))

В файле views.py я просто запускаю внешний скрипт

def homepage(request):
    context = {}
    form = CategoryForm()
    context['form'] = form
    if request.GET:
        temp = request.GET['prodcategory']
        selected = ProductCategory.objects.get(pk=temp)
        scraper = Scraper()
        results = scraper.scrape(title=selected, link=selected.link)
        data = ProductSubCategory.objects.filter(parent=results)
        context['data'] = data
    return render(request, 'index.html', context)

Есть хорошая статья о том, как использовать цепочки выпадающих списков в Django формах :

Как реализовать зависимый/цепной выпадающий список в Django

или вы можете использовать внешнюю библиотеку, например django-smart-selects

Вернуться на верх