Django Custom Widget throwing error

71 views
Skip to first unread message

Mrinmoy Das

unread,
Dec 21, 2013, 12:45:05 PM12/21/13
to django...@googlegroups.com
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?

Reply all
Reply to author
Forward
0 new messages