Как добавить в поле фильтра crispy фильтр из другой модели?
Мне нужна помощь в добавлении поля из другой модели в мой фильтр crispy.
У меня есть модель Warehouse с товаром и частями и фильтр на основе названия товара. У меня есть модель Product с названием, pyear и категорией, и я смог добавить pyear в фильтр, и он работает.
Наконец, у меня есть модель Category с именем category_name и я хотел бы добавить имя категории в фильтр. Я пытаюсь добавить поле категории в фильтр как category__category_name или через таблицу продуктов, как показано ниже product__category__category_name, но поле категории не отображается в html шаблоне и я получаю следующую ошибку:
KeyError: "Key 'category' not found in 'WarehouseDataFilterForm'. Choices are: pieces, product, pyear."
И мой вопрос в том, как я могу добавить имя_категории в мой фильтр? Чтобы поле категории было видно в шаблоне и я мог фильтровать данные по категории.
Модели:
class Category(models.Model):
category_name = models.CharField("Category", max_length=100, blank=True, null=True)
class Product(models.Model):
name = models.CharField("Product", max_length=150)
pyear = models.IntegerField("Production Year", null=True, blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
class Warehouse(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, blank=True)
pieces = models.IntegerField("Quantity", null=True, blank=True)
Фильтр:
class WarehouseDataFilterFormHelper(FormHelper):
form_method = 'GET'
layout = Layout(
Div(
Div("product", css_class="col-12 col-sm-8 col-md-5"),
Div("category", css_class="col-8 col-sm-4 col-md-2"),
Div("pyear", css_class="col-4 col-sm-3 col-md-2"),
Div(Submit('submit', 'Filter', css_class='btn btn-dark'), css_class="col-2 col-md-1 block my-auto align-bottom text-center"),
Div(HTML('<a href="/warehouse/warehouse_data" class="orange"><i class="fa-regular fa-trash-can"></i> Clear</a>'), css_class="col-2 text-center block my-auto align-bottom"),
css_class="row"
),
)
class WarehouseDataFilter(django_filters.FilterSet):
product = django_filters.CharFilter(label="Produkt", field_name="product__name", lookup_expr='icontains')
category = django_filters.CharFilter(label="Kategorie", field_name="product__category__category_name", lookup_expr="icontains" ),
pyear = django_filters.NumberFilter(label="Rok výroby", field_name="product__pyear")
class Meta:
model = Warehouse
fields = ("product", "pieces")
attrs={"a": {"class": "orange"}, "thead": {"class": "orange"}}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form.helper = WarehouseDataFilterFormHelper()
Просмотров:
class WarehouseDataView(LoginRequiredMixin, FilterView):
template_name = "warehouse/warehouse_data.html"
model = Warehouse
filterset_class = WarehouseDataFilter
def get_filterset(self, filterset_class):
filterset = super().get_filterset(filterset_class)
filterset.form.helper = WarehouseDataFilterFormHelper()
return filterset
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
inventory_data = self.object_list.values().order_by("product")
try:
updated = Warehouse.objects.values("updated_on").last()
except:
updated = 0
context["updated"] = updated
try:
wtable = utils.warehouse_data_creation(inventory_data)
except:
wtable = 0
context["wtable"] = wtable
try:
warehouse_dict = utils.warehouse_dict_summary(wtable)
except:
warehouse_dict = 0
context["warehouse_dict"] = warehouse_dict
return context
Большое спасибо за помощь.