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