Python 使用django crispy表单处理带有拆分字段的django筛选器表单

Python 使用django crispy表单处理带有拆分字段的django筛选器表单,python,django,django-crispy-forms,django-filter,Python,Django,Django Crispy Forms,Django Filter,我有一张表正在被过滤。我已经实施了一项基于选项D的计划 但是,我使用bootstrap3进行表单渲染。这非常有效,直到我想应用一个,它会输出两个字段(一个最小字段和一个最大字段) 我得到的输出是 我想手动控制每个字段,这样我就可以分别对它们进行预填充 有什么想法吗 视图.py 来自crispy_forms.bootstrap导入PrependedAppendedText,FormActions 从crispy_forms.helper导入FormHelper 从crispy_forms.layo

我有一张表正在被过滤。我已经实施了一项基于选项D的计划

但是,我使用bootstrap3进行表单渲染。这非常有效,直到我想应用一个,它会输出两个字段(一个最小字段和一个最大字段)

我得到的输出是

我想手动控制每个字段,这样我就可以分别对它们进行预填充

有什么想法吗

视图.py

来自crispy_forms.bootstrap导入PrependedAppendedText,FormActions
从crispy_forms.helper导入FormHelper
从crispy_forms.layout导入布局,提交,按钮
从django_表2导入SingleTableView
从aids.filters导入AidFilter
导入操作系统
类FilteredSingleTableView(SingleTableView):
过滤器类=无
def get_表格_数据(自身):
self.filter=AidFilter(
self.request.GET,
queryset=super(FilteredSingleTableView,self)。获取表格数据(),
)
self.filter.helper=FormHelper()
self.filter.helper.form\u id='id\u filterPerform'
self.filter.helper.form_class='form inline'
self.filter.helper.form_方法='get'
self.filter.helper.form_标记=True
self.filter.helper.field_template=os.path.join('bootstrap3','layout','inline_field.html'))
self.filter.helper.layout=布局(
“姓名”,
PrependedAppendText('价格','美元','分钟',),
#字段集(
#“按价格过滤”,
#PrependedAppendedText('price_0','$','min',id='id_price_0'),
#PrependedAppendedText('price_1','$','max',id='id_price_1'),
# ),
"maint",,
"岗位",,
“供应商”,
形态(
提交('Submit_filter','filter',css_class='btn-primary'),
按钮(‘清除’、‘清除’、css_class='btn-sm')
)
)
返回自滤波
def获取上下文数据(自身,**kwargs):
context=super(FilteredSingleTableView,self)。获取上下文数据(**kwargs)
上下文['filter']=self.filter
返回上下文
过滤器.py

导入django\u过滤器
来自aids.models的进口援助
AidFilter类(django_filters.FilterSet):
name=django\u filters.CharFilter(查找\u type='contains')
price=django_filters.RangeFilter()
类元:
模型=援助
字段=[“名称”、“价格”、“维护”、“发布”、“供应商”]
查看表格.html

{%extends'base.html%}
{%block title%}{{title}{%endblock%}
{%block-extra_-css%}
{%endblock%}
{%load render_Tables from django_Tables 2%}
{%load crispy_forms_tags%}
{%block heading%}
{{title}}
{%endblock%}
{%block content%}
{%crispy filter.form filter.helper%}
{%render_table%}
{%endblock%}
url.py

从django.conf.url导入模式,包括,url
从django.conf.url.static导入静态
从django.contrib导入管理
从aids.filters导入AidFilter
来自aids.models的进口援助
从aids.tables导入aiddable
从sadb导入设置
从aids.views导入过滤器SingleTableView
admin.autodiscover()
urlpatterns=模式(“”,
url(r“^admin/”,包括(admin.site.url)),
url(r“^aid_-form/”、“aids.views.aid_-form”),
url(r“^supplier\u form/”、“aids.views.supplier\u form”),
url(r“^view\u aids/”,“aids.views.view\u aids”),
网址(
r'^$',FilteredSingleTableView.as_视图(
模型=援助,
table_class=AidTable,
模板\u name='view\u table.html',
filter\u class=AidFilter
),name='filtered\u视图'
),
)+静态(settings.MEDIA\u URL,document\u root=settings.MEDIA\u root)

在覆盖
日期范围过滤器之后,我遇到了类似的问题,并通过修改小部件输出,使其周围有一个div包装器,该包装器带有
表单内联
类以及小部件类末尾的
def format_output()
中的修改位

截图(声誉不允许我发布图片!)

我的完整代码如下(最初取自)

class DateRangeWidget(forms.MultiWidget):
定义初始化(self,attrs=None):
attrs_from={'class':'date from'}
attrs_to={'class':'date to'}
如果属性:
attrs_from.update(attrs)
属性更新(attrs)
widgets=(forms.TextInput(attrs=attrs\u-from),forms.TextInput(attrs=attrs\u-to))
超级(DateRangeWidget,self)。\uuuu初始化(widgets,attrs)
def解压缩(自身,值):
如果值:
返回[value.start,value.stop]
返回[无,无]
def格式_输出(自、渲染_小部件):
返回'+'-'.join(呈现的_小部件)+''
类DateRangeField(forms.MultiValueField):
widget=DateRangeWidget
定义初始化(self,*args,**kwargs):
字段=(
forms.DateField(),
forms.DateField(),
)
super(DateRangeField,self)。\uuuu init\uuuu(fields,*args,**kwargs)
def压缩(自我,数据列表):
如果数据列表:
返回片(*数据列表)
一无所获
类DateRangeFilter(筛选器):
field\u class=DateRangeField
def过滤器(自身、qs、值):
date\u start=datetime.datetime.combine(value.start,datetime.time(0,0,0))
date\u stop=datetime.datetime.combine(value.stop,datetime.time(23,59,59))
如果值:
查找=“%s\u”范围“%self.name”
返回qs.filter(**{lookup:(开始日期,停止日期)})
返回qs
class DateRangeWidget(forms.MultiWidget):
    def __init__(self, attrs=None):
        attrs_from = {'class': 'date-from'}
        attrs_to = {'class': 'date-to'}

        if attrs:
            attrs_from.update(attrs)
            attrs_to.update(attrs)

        widgets = (forms.TextInput(attrs=attrs_from), forms.TextInput(attrs=attrs_to))
        super(DateRangeWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            return [value.start, value.stop]
        return [None, None]

    def format_output(self, rendered_widgets):
        return '<div class="date-range form-inline">' + ' - '.join(rendered_widgets) + '</div>'


class DateRangeField(forms.MultiValueField):
    widget = DateRangeWidget

    def __init__(self, *args, **kwargs):
        fields = (
            forms.DateField(),
            forms.DateField(),
        )
        super(DateRangeField, self).__init__(fields, *args, **kwargs)

    def compress(self, data_list):
        if data_list:
            return slice(*data_list)
        return None


class DateRangeFilter(Filter):
    field_class = DateRangeField

    def filter(self, qs, value):
        date_start = datetime.datetime.combine(value.start, datetime.time(0, 0, 0))
        date_stop = datetime.datetime.combine(value.stop, datetime.time(23, 59, 59))

        if value:
            lookup = '%s__range' % self.name
            return qs.filter(**{lookup: (date_start, date_stop)})
        return qs