I have this form and custom widget
class BidDateWidget(widgets.DateInput):
"""
Renders a Twitter Bootstrap Date Input.
"""
class Media:
css = ("{{ STATIC_URL }}stylesheet/datetimepicker.css")
js = ("{{ STATIC_URL }}js/bootstrap-datetimepicker.js")
def render(self, name, value, attrs=None):
if value is None: value = ''
final_attrs = self.build_attrs(attrs, type="text", name=name)
if final_attrs.get('class'):
final_attrs['class'] = final_attrs['class'] + ' input-small'
if final_attrs.get('disabled'):
datepicker_css_class = 'input-append'
else:
datepicker_css_class = 'input-append date'
# only add value attribute if value is non-empty
final_attrs['value'] = value
html = '''
<div class="span3">
<h5>Bid Ending Date</h5>
<div class="{1}" id="datetime1" data-date-format="mm-dd-yyyy">
<input{0} />
<span class="add-on">
<i class="icon-th"></i>
</span>
</div>
</div>
'''
return mark_safe(html.format(flatatt(final_attrs), datepicker_css_class))
class BidTimeWidget(widgets.TimeInput):
"""
Renders a Twitter Bootstrap Date Input.
"""
class Media:
css = ("{{ STATIC_URL }}stylesheet/bootstrap-timepicker.min.css")
js = ("{{ STATIC_URL }}js/bootstrap-timepicker.min.js")
def render(self, name, value, attrs=None):
final_attrs = self.build_attrs(attrs, type="text", name=name)
final_attrs['class'] = "input-small time"
final_attrs['id'] = "datetime2"
final_attrs['type'] = "text"
if value is None:
final_attrs['value'] = ''
else:
final_attrs['value'] = datetime.datetime.strptime(value, "%H:%M %p").time()
timepicker_css_class = 'input-append'
html = '''
<div class="span4 pull-right">
<h5>Bid Ending Time</h5>
<div class="{1} bootstrap-timepicker">
<input {0}/>
<span class="add-on">
<i class="icon-time"></i>
</span>
</div>
</div>
'''
return mark_safe(html.format(flatatt(final_attrs), timepicker_css_class))
class BidSplitDateTime(forms.SplitDateTimeWidget):
"""
A SplitDateTime Widget that has some admin-specific styling.
"""
def __init__(self, attrs=None):
widgets = [BidDateWidget,BidTimeWidget]
# Note that we're calling MultiWidget, not SplitDateTimeWidget, because
# we want to define widgets.
forms.MultiWidget.__init__(self, widgets, attrs)
def format_output(self, rendered_widgets):
return mark_safe(u'%s %s' % \
(rendered_widgets[0], rendered_widgets[1]))
class BidCreateForm(forms.ModelForm):
required_css_class = 'required'
def __init__(self, *args, **kwargs):
user = kwargs.pop('vehicles_available')
super(BidCreateForm, self).__init__(*args, **kwargs)
self.fields['vehicles_available'].queryset = CarrierVehicle.objects.filter(carrier__user=user)
self.fields['vehicles_available'].help_text = None
class Meta:
model = Bid
exclude = ('created_on', 'created_by', 'created_from',
'last_modified_on', 'last_modified_by', 'last_modified_from',
'job', 'accepted', 'spam', )
fields = ('one_liner', 'quote_price', 'message', 'vehicles_available','bid_ending_in' )
widgets = {
'one_liner': forms.TextInput(attrs={'class': 'span8'}),
'quote_price': forms.TextInput(attrs={'class': 'span10'}),
'message': forms.Textarea(attrs={'class': 'span10', 'rows': '6'}),
'vehicles_available' : forms.CheckboxSelectMultiple(),
'bid_ending_in' : BidSplitDateTime()
}
Thing is whenever I am posting this form, it goes to form-invalid, and returns this error
<ul class="errorlist"><li>bid_ending_in<ul class="errorlist"><li>Enter a valid date/time.</li></ul></li></ul>
Any Help?