我正在为一家房地产机构构建基于 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),但它似乎不起作用。
请帮助我,我被困住了!
试试这个
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