如何将日期选择器与django-filter一起使用?

时间:2018-03-01 16:53:51

标签: django datepicker django-filter

我试图弄清楚如何在django-filter中使用datepicker。我尝试了一些小部件,但它没有工作。任何建议将不胜感激!

我想将datepicker用于row_date搜索过滤器。

filters.py

from home2.models import AvailstaticCopy
from django import forms

import django_filters

class DateInput(forms.DateInput):
    input_type = 'date'

class AvailFilter(django_filters.FilterSet):

    class Meta:
        model   = AvailstaticCopy
        widgets = {'row_date': DateInput(),}
        fields  = ['row_date', 'director','manager','analyst',]

这是我的模板

{% load widget_tweaks %}
<form method="get">
  <div class="well">
    <h4 style="margin-top: 0">Filter</h4>
    <div class="row">
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.row_date.label_tag }}
        {% render_field filter.form.row_date class="form-control" %}
      </div>
      <div class="form-group col-sm-4 col-md-3">
        {{ filter.form.director.label_tag }}
        {% render_field filter.form.director class="form-control" %}
      </div>
      <div class="form-group col-sm-8 col-md-6">
        {{ filter.form.manager.label_tag }}
        {% render_field filter.form.manager class="form-control" %}
      </div> 
      <div class="form-group col-sm-8 col-md-6">
        {{ filter.form.analyst.label_tag }}
        {% render_field filter.form.analyst class="form-control" %}
      </div> 
      <div class="form-group col-sm-8 col-md-6">
        <button type="submit" class="btn btn-primary">
          <span class="glyphicon glyphicon-search"></span> Search
        </button>
      </div>
    </div>
  </div>
</form>

3 个答案:

答案 0 :(得分:3)

你不清楚你想到的是什么样的日期选择,但我认为你想要这样的东西:
jQuery UI Datepicker

我希望您知道如何使用第三方JavaScript库。这应该超出了这个问题的范围。

将项目设置为使用jQuery UI后,您可以更改filters.py

class AvailFilter(django_filters.FilterSet):
    row_date = django_filters.DateFilter(
        widget=DateInput(
            attrs={
                'class': 'datepicker'
            }
        )
    )

    class Meta:
        # keep everything but the line widgets

您使用的任何小部件都接受一个关键字参数attrs,它接受​​一个字典,您可以在其中指定HTML标记的所有属性。

现在当你渲染row_date时,它应输出如下内容:

<input type="date" class="datepicker" ... />

答案 1 :(得分:1)

要提供类似于cezar答案的另一个答案,我在下面用过滤器和模板代码这样做。

filter.py

import django_filters
from .models import Product
from django import forms

class ProductFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    price = django_filters.NumberFilter()

    # using jquery
    djfdate_time = django_filters.DateFilter(
        lookup_expr='icontains',
        widget=forms.DateInput(
            attrs={
                'id': 'datepicker',
                'type': 'text'
            }
        )
    )

    class Meta:
        model = Product
        fields = ['name', 'djfdate_time','price']

base.html

{% load static %}
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="{% static 'css/search.css' %}">
        <title></title>
        <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
        <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    </head>
    <body>
        <div id="header">
            <h1 ><a class="searchtitle" href="/">Django Filter Example</a></h1>
        </div>
        <div id="content">
            {% block content %}
            {% endblock %}
        </div>

        <script>
        $( function() {
            $( "#datepicker" ).datepicker();
        } );
        </script> 
    </body>
</html>

base_extension.html

{% extends "base.html" %}
{% load my_templatetags %}

{% block content %}
    <form action="" method="get">
        <div>Name{{ filter.form.name }}</div>
        <div>Price{{ filter.form.price }}</div>
        <div>Date_Time{{ filter.form.djfdate_time }}</div>
        <input type="submit" />
    </form>

    {% for obj in dataqs.object_list %}  
        {{ obj.name }}
            <div>
                <li>${{ obj.price }}</li>
                <li> {{ obj.djfdate_time|date:'m-d H:i:s.u' }}</li>
            </div>
    {% endfor %}

{% endblock %}

答案 2 :(得分:1)

type =“ date”可以帮助您,无需任何小部件(取决于浏览器):

class AvailFilter(django_filters.FilterSet):
    row_date = django_filters.DateFilter(widget=DateInput(attrs={'type': 'date'}))

如果您还需要日期范围过滤器,则可以使用DateFromToRangeFilter代替DateFilter