我在Django中遇到一些实现问题。我的应用程序从用户上传的excel中读取数据。它从中提取日期,例如最早的日期和最近的日期。我能够以html格式显示这两个日期摘录,并允许用户自定义选择时间范围。 (通过django form.py)。为了提供更好的用户体验,我想以允许用户使用的形式创建日期范围滑块。到目前为止,我能够找到一个名为django_range_slider的Django程序包。 (https://github.com/shaklev/django_range_slider/tree/master/test_slider)只要范围的整数值,我也可以正确实现此程序包功能。当我输入日期值时,它不能很好地工作。
这是 forms.py :
from django import forms
from .fields import RangeSliderField
from .models import TestModel
from django.forms.widgets import SelectDateWidget
class TestFieldForm(forms.Form):
class Meta:
model = TestModel
fields = ['range_field','name_range_field','label_range_field']
def __init__(self, *args, **kwargs):
super(TestFieldForm, self).__init__(*args, **kwargs)
self.fields['name_range_field'] = RangeSliderField(minimum=30,maximum=300,name="TestName")
self.fields['range_field'] = RangeSliderField(minimum=10,step=10,maximum=102)
self.fields['label_range_field'] = RangeSliderField(label=True,minimum=1,maximum=100)
class fcPForm(forms.Form):
label_range_field = RangeSliderField(label="Date Range",minimum="",maximum="") # with label (no name)
这是 models.py :
from __future__ import unicode_literals
from django.db import models
class TestModel(models.Model):
#range_field = models.CharField(max_length=200)
#name_range_field = models.CharField(max_length=200)
label_field = models.DateField()
这是 views.py :
from .models import actuals,forecast,TestModel
def analyze(request):
if request.method == 'POST':
form = InputForm(request.POST,request.FILES)
dataType = request.POST.get("DataType")
request.session['dataType']=dataType
if form.is_valid():
sheet = request.FILES['FileLocation'].get_sheet()
book = request.FILES['FileLocation'].get_book()
#do calculation to find out eDate,lDate
fcForm = fcPForm(initial = {'label_range_field':(eDate,lDate)})
if fcForm.is_valid():
cdFC = fcForm.cleaned_data
return render(request,'abc.html',{'earliestDt':earliestDate,'latestDt':latestDate,'form':fcForm,context)
这是fields.py:
from django import forms
from .widgets import RangeSlider
class RangeSliderField(forms.CharField):
def __init__(self, *args, **kwargs):
self.name = kwargs.pop('name', '')
self.minimum = kwargs.pop('minimum',0)
self.maximum = kwargs.pop('maximum',100)
self.step = kwargs.pop('step',1)
kwargs['widget'] = RangeSlider(self.minimum, self.maximum, self.step, self.name)
if 'label' not in kwargs.keys():
kwargs['label'] = False
super(RangeSliderField, self).__init__(*args, **kwargs)
这是abc.html:
<form action="{% url 'DjangoApp:xyz'%}" method="post" enctype="multipart/form-data">{% csrf_token %}
<table>
{{ form }}
</table>
{% csrf_token %}
<input type="submit" value="Submit Data">
</form>
如果我将常规整数值传递给表单,则会显示范围幻灯片,并且能够与之交互。当传递的日期值显示在文本框中时,但滑块消失。愿意接受其他建议/不同的做事方式。