如何使用Crispy Forms渲染django-filter的FilterSet筛选栏
django-filter 和 django-crispy-forms 完全兼容,你遇到的问题是没有为FilterSet生成的表单配置crispy的渲染规则,以下是具体解决方案:
方案1:在FilterSet中配置FormHelper(推荐)
直接修改你的Filter.py文件,添加FormHelper配置:
import django_filters from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit from .models import log class logFilter(django_filters.FilterSet): class Meta: model = log fields = { 'varfliedhere': ['icontains'], 'varfliedhere': ['icontains'], 'varfliedhere': ['icontains'], 'Boolean varfliedhere': ['exact'], } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 初始化Crispy FormHelper self.helper = FormHelper() self.helper.form_method = 'get' # 因为你模板中已经手动写了<form>标签,关闭helper自动生成form标签 self.helper.form_tag = False # 可选:直接在helper中添加提交按钮,就不需要在模板中单独写 # self.helper.add_input(Submit('submit', '搜索', css_class='btn btn-primary'))
对应的模板修改,直接把原来的{{ myFilter.form }}替换为crispy专属标签即可:
<form method="get"> {% crispy myFilter.form %} <button class="btn btn-primary" type="submit">搜索</button> </form>
方案2:模板逐字段渲染(适合自定义布局场景)
如果你需要自定义字段的展示顺序和布局,需要注意:django-filter生成的表单字段名会自动拼接查询后缀,比如你在fields中定义的'varfliedhere': ['icontains'],对应的表单字段名为varfliedhere__icontains,正确的渲染写法为:
<form method="get"> {{ myFilter.form.varfliedhere__icontains|as_crispy_field }} {{ myFilter.form.另一个字段名__icontains|as_crispy_field }} {{ myFilter.form.Boolean_varfliedhere__exact|as_crispy_field }} <button class="btn btn-primary" type="submit">搜索</button> </form>
前置检查项
确认你的settings.py中已经正确配置crispy相关参数,示例(以bootstrap5为例,如果你用其他版本修改对应配置即可):
INSTALLED_APPS = [ # 你的其他应用 'crispy_forms', 'crispy_bootstrap5', ] CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" CRISPY_TEMPLATE_PACK = "bootstrap5"
内容的提问来源于stack exchange,提问作者NewDevAsks1
相关产品推荐
相关产品推荐

