Django, optgroup, вывод категорий и подкатегорий
Как вывести подкатегории, отсосящиеся только к данной категории? Вот как это выглядит сейчас:

models.py:
class Category(models.Model):
category_text = models.CharField(max_length=100)
def __str__(self):
return self.category_text
class SubCategory(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
subcategory_text = models.CharField(max_length=100)
def __str__(self):
return self.subcategory_text
views.py:
class AdCreate(CreateView):
subcategories = SubCategory.objects.all()
model = Ad
fields = ['city', 'category', 'ad_title', 'ad_text', 'img']
def get_context_data(self, **kwargs):
create = super(AdCreate, self).get_context_data(**kwargs)
create['subcategories'] = self.subcategories
return create
form.html:
<div class="col-75">
<select id="category" name="category">
{% for category in subcategories %}
<optgroup label="{{ category.category }}">
<option value="{{ category.id }}">{{ category.subcategory_text }}</option>
</optgroup>
{% endfor %}
</select>
</div>
Ответы (1 шт):
Автор решения: 5c0rp
→ Ссылка
Можно обойтись одной моделью Category, а именно
class Category(models.Model):
parent = models.ForeignKey(self, on_delete=models.CASCADE, null=True)
category_text = models.CharField(max_length=100)
def __str__(self):
return self.category_text
Таким образом сокращаем кол-во моделей и получаем возможность создавать подкатегорию для подкатегории и т.д. :) Главные категории будут те у которых parent=None. Далее во view проходим рекурсивно по главным категориям и формируем иерархию.
Если отвечать на вопрос прямо то нужно в view которая отвечает за рендеринг файл form.html сделать фильтрацию по типу
subcategories = SubCategory.objects.filter(category=<нужная_категория>)
и передать subcategories в рендер
return render(request, 'form.html', {'subcategories': subcategories})