使用django-filter时如何根据不同FilterView动态修改搜索框placeholder
解决方法
你可以通过动态给FilterSet传参的方式实现占位符的自定义,改动分为两步:
1. 改造MovieFilter支持接收动态placeholder
修改filters.py代码,移除硬编码的placeholder,重写FilterSet的初始化方法接收外部传入的占位符参数:
import django_filters from django.forms.widgets import TextInput from .models import Movie class MovieFilter(django_filters.FilterSet): author = django_filters.CharFilter( label='', lookup_expr='contains', widget=TextInput() # 此处不要写死placeholder ) class Meta: model = Movie fields = ['author'] def __init__(self, *args, **kwargs): # 先取出自定义的placeholder参数,默认值保留通用搜索提示 placeholder = kwargs.pop('placeholder', 'Search') super().__init__(*args, **kwargs) # 动态给搜索框组件设置占位符 self.filters['author'].field.widget.attrs.update({ 'placeholder': placeholder })
2. 在不同视图中传入对应占位符
FilterView提供了get_filterset_kwargs方法用来传递FilterSet初始化参数,你只需要在两个视图中分别重写该方法,传入对应占位符即可:
#HotTop View class HotTopView (FilterView): model = Movie template_name = 'pages/hot_top.html' filterset_class = MovieFilter paginate_by = 6 def get_queryset(self): category_qs = self.model.objects.filter(category="HOT-TOP") return category_qs.order_by('-date_posted') # 新增方法传入自定义placeholder def get_filterset_kwargs(self, filterset_class): kwargs = super().get_filterset_kwargs(filterset_class) kwargs['placeholder'] = 'Search in Hot Top' return kwargs #Odkrycia View class OdkryciaView (FilterView): model = Movie template_name = 'pages/odkrycia.html' filterset_class = MovieFilter paginate_by = 6 def get_queryset(self): category_qs = self.model.objects.filter(category="ODKRYCIA") return category_qs.order_by('-date_posted') # 新增方法传入自定义placeholder def get_filterset_kwargs(self, filterset_class): kwargs = super().get_filterset_kwargs(filterset_class) kwargs['placeholder'] = 'Search in Odkrycia' return kwargs
可选优化:抽离公共父类减少重复代码
如果后续还会新增更多分类视图,可以把公共逻辑抽成基类,简化后续开发:
# 先定义公共基类 class BaseMovieCategoryView(FilterView): model = Movie filterset_class = MovieFilter paginate_by = 6 # 子类只需要定义这三个属性即可 category = None template_name = None search_placeholder = None def get_queryset(self): return self.model.objects.filter(category=self.category).order_by('-date_posted') def get_filterset_kwargs(self, filterset_class): kwargs = super().get_filterset_kwargs(filterset_class) kwargs['placeholder'] = self.search_placeholder return kwargs # 子类实现大幅简化 class HotTopView(BaseMovieCategoryView): category = "HOT-TOP" template_name = 'pages/hot_top.html' search_placeholder = "Search in Hot Top" class OdkryciaView(BaseMovieCategoryView): category = "ODKRYCIA" template_name = 'pages/odkrycia.html' search_placeholder = "Search in Odkrycia"
内容的提问来源于stack exchange,提问作者Klewiu
相关产品推荐
相关产品推荐

