Python 如何在带有日期字段的django中使用FilterSet
我有一个dat_transacao字段,我想用它创建一个范围,但它不起作用。我在filters.py中创建了dat_initial和dat_final,但屏幕没有按这些字段过滤记录。有点不对劲,但我不知道是什么。有人能帮我吗? 谢谢 models.py: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
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>
...