访问django_filters中相关模型字段

问题描述 投票:0回答:1

我正在为一家房地产机构构建基于 Django 的 4 语言网站。我正在使用 django-filter 包通过某些参数过滤我的对象(房地产),例如类型(房屋、公寓等)、城市和其他一些参数。

我的“类型”字段是模型“类型”的外键。它使用 ModelChoiceFilter 从数据库中选择所有可用类型,并将它们红色化为带有选项的

select
元素,该元素显示为带有选项的下拉列表,到目前为止效果很好。

class SalePropertyFilter(FilterSet):
    ...

    type = ModelChoiceFilter(
        queryset=Type.objects.all(),
        empty_label=_("Any type"),
        label="",
        widget=forms.Select(attrs={'class': 'form-control'}),
        )

但由于某种原因,选项显示为类型的别名(“房屋”、“公寓”等,请参阅附图)。它是我的外键模型类型的“slug”字段。相反,我想在选项中打印“名称”字段。该字段已翻译(django-modeltranslation 包),因此在英语版本中应该看到选项“House”、“Apartment”...,而在西班牙语版本中应该看到选项“Casa”、“Apartamento”等。

我尝试在 PropertyFilter 中修改此字段,使用“__”符号(type__name 而不是 type),但它似乎不起作用。

请帮助我,我被困住了!

django select django-filter
1个回答
1
投票

试试这个

from modeltranslation.utils import get_language

class SalePropertyFilter(FilterSet):
    type = ModelChoiceFilter(
        queryset=Type.objects.all(),
        empty_label=_("Any type"),
        label="",
        widget=forms.Select(attrs={'class': 'form-control'}),
        method='filter_type'
    )

    def filter_type(self, queryset, name, value):
        language = get_language()  # Get the current language
        translated_field_name = f'type__name_{language}'  # Assuming your translation fields follow the pattern "name_{language}"

        if value:
            return queryset.filter(**{translated_field_name: value})
        return queryset
© www.soinside.com 2019 - 2024. All rights reserved.