Python 如何在带有日期字段的django中使用FilterSet

Python 如何在带有日期字段的django中使用FilterSet,python,html,django,Python,Html,Django,我有一个dat_transacao字段,我想用它创建一个范围,但它不起作用。我在filters.py中创建了dat_initial和dat_final,但屏幕没有按这些字段过滤记录。有点不对劲,但我不知道是什么。有人能帮我吗? 谢谢 models.py: class transacao(models.Model): dat_transacao = models.DateTimeField('Geração da Transação', auto_now=True) pessoa

我有一个dat_transacao字段,我想用它创建一个范围,但它不起作用。我在filters.py中创建了dat_initial和dat_final,但屏幕没有按这些字段过滤记录。有点不对劲,但我不知道是什么。有人能帮我吗? 谢谢

models.py:

class transacao(models.Model):
    dat_transacao = models.DateTimeField('Geração da Transação', auto_now=True)
    pessoa = models.ForeignKey(pessoa, default='', blank=True, null=True) # Chave estrangeira da Classe Pessoa
    tipotransacao = models.ForeignKey(tipotransacao, default='', blank=True, null=True) # Chave estrangeira da Classe Tipo de Transação
    servico = models.ForeignKey(servico, default='', blank=True, null=True) # Chave estrangeira da Classe Servico (que pode ser NULL)
    bloco = models.ForeignKey(bloco, default='', blank=True, null=True) # Chave estrangeira da Classe Bloco
filters.py:

from .models import *
import django_filters
#from django_filters import DateTimeFilter

class livrorazaoFilter(django_filters.FilterSet):

    dat_inicial = django_filters.DateTimeFilter(name='dat_transacao',lookup_type=('gte'))
    dat_final = django_filters.DateTimeFilter(name='dat_transacao',lookup_type=('lte'))

    class Meta:
        model = transacao
        fields = ['dat_inicial', 'dat_final', 'tipotransacao', 'pessoa', 'bloco']
views.py

def transacao_livrorazao(request, id=None):
    instancia_transacao = transacao.objects.all().order_by('-dat_transacao')
    instancia_transacaofilter = livrorazaoFilter(request.GET, queryset=instancia_transacao)
    context = {
            "queryset": instancia_transacao,
            "filter": instancia_transacaofilter,
            "instancia_transacao": instancia_transacao
    }
    return render(request, 'livrorazao/livrorazao.html', context)
livrorazo.html:

<!DOCTYPE html>
<html dir="ltr">

        <form class=" bd-form-2 " action="#" name="form-name" method="get">
            {% csrf_token %}

        <p>Período</p>
        <p>De</p>
            <input type="date" name='filter.form.dat_inicial' id="dat_inicial"  class="bd-form-input" >
        <p>até</p>
            <input type="date" name='filter.form.dat_final' id="dat_final"  class="bd-form-input" >
        <p>Tipo de Transação</p>
             {{ filter.form.tipotransacao }}

         <button type="submit">Consultar</button>
        </form>

        <br>
        <table width="100%" border="0" cellspacing="1" cellpadding="2">
        <tbody><tr>
            <th>ID Transação</th>
            <th>Data/Hora</th>
            <th>TipoTransação</th>
            <th>Blockchain</th>
        </tr>

      {% for instance in filter.qs  %}
        <tr>
            <td>{{ instance.id }}</td>
            <td>{{ instance.dat_transacao }}</td>
            <td>{{ instance.tipotransacao }}</td>
            <!--<td>{{ instance.pessoa }}</td>-->
            <td>{{ instance.bloco }}</td>
        </tr>
      {% endfor %}

</tbody></table>
</html>
您可以使用DateFromToRangeFilter。将此代码段添加到FilterSet类,而不是dat_inicial和dat_final:

此筛选器应创建两个输入字段,并查询值介于下限和上限之间的条目。通过传递更多参数,可以修改外观和行为,例如添加日期选择器:

dat_transacao = django_filters.DateTimeFromToRangeFilter(
    widget=django_filters.widgets.RangeWidget(
        attrs={'class': 'datepicker'}
    )
)
然后根据需要调整HTML模板。基本上,它应该适用于以下几行:

<form class="bd-form-2 " action="" name="form-name" method="get">
    {% csrf_token %}
    {{ filter.form }}
    <button type="submit">Consultar</button>
</form>

我的解决方案与@cezar发布的类似。然而,将attrs={'class':'datepicker'}更改为attrs={'type':'date'}对我来说是有效的

我的前端表单显示使用

以下是对我有用的内容的摘录:

models.py 过滤器.py views.py 带引导的applications.html 注:默认情况下,我将django_过滤器添加到settings.py


谢谢我包括dat_transacao=django_filters.DateTimeFromtorRange Filter,并删除了dat_inicial和dat_final。我的HTML是这样的,但它不起作用,它没有创建两个字段。它不起作用:在模板C:\GROWTHTECH\Projetos\blockchain\transacao\templates\testes\livroazao2.HTML中的模板呈现过程中出错,在第7行django_filters/widgets/multiwidget.HTML中出错,我知道了!!!当我在已安装的应用程序中包含“django_过滤器”和html中的{{filter.form.dat_transacao}时,它就起作用了。但当我加入时它不起作用是的,你必须在安装的应用程序中加入django_过滤器。在第二句中的示例中,name=filter.form.dat_transacao无法工作。必须将模板变量括在双大括号{{filter.form.dat_transacao}中。但是,正如我所说的,您应该能够使用{{filter.form}呈现过滤器表单。如果这种通用方法不能满足您的需要,您可以手动呈现表单字段。是。我更新到这个:。在这种情况下,第一个日期可以,但第二个日期不起作用,因为没有显示输入日期类型。
<form class="bd-form-2 " action="" name="form-name" method="get">
    {% csrf_token %}
    {{ filter.form }}
    <button type="submit">Consultar</button>
</form>
class Applications(models.Model):
    #...
    status = models.CharField(max_length=10, choices=STATUS)
    start_date = models.DateTimeField(auto_now_add=True)
from .models import Applications
import django_filters

class ApplicationFilter(django_filters.FilterSet):
    start_date = django_filter.DateTimeFromRangeFilter(widget=django.widgets.RangeWidget(
    attrs={'type': 'date'}))

    class Meta:
        model = Applications
        fields = ['status', 'start_date']
from django.shortcuts import render
from .models import Applications
from .filters import ApplicationFilter

def application_search(request):
    #... I stripped the view function down to what concerns filters.py
    application_list = Application.objects.all()
    application_filter = ApplicationFilter(request.GET, queryset=application_list)

    return render(
        request,
        "applications.html,
        {'filter': application_filter}
    )
...
{% load bootstrap4 %}{% load widget_tweaks %}
<form method="GET" class="form-inline">
<div class=form-group>
<label style="margin-right: 20px">Filter: </label>
{% render_field filter.form.status class="form-control"%}
<label style="margin-left: 20px; margin-right: 10px;">From </label>
{% render_field filter.form.start_date class="form-control" %}
<button style="margin-left: 10px" class="btn btn-primary btn-md">
 GO
</button>
</div>
</form>
...