Hi Mark, You must understand that each Widget in :
widgets = ( forms.TextInput(attrs=attrs), forms.TextInput(attrs=attrs), forms.TextInput(attrs=attrs), ) Has a *render()* method that return html of widget. You must only concatenate each html of widget. You can use *format_output* like this: def format_output(self, rendered_widgets): widget_a = rendered_widgets[0] widget_b = rendered_widgets[1] widget_c = rendered_widgets[2] return "%s %s/%s" $(widget_a, widget_b, widget_c) I hope that solution above be that you want, but if you want customizing html/css/javascript of TextInput widget, you must override render() method of forms.TextInput widget. Cheers. On Fri, Apr 11, 2014 at 12:33 PM, Mark Phillips <m...@phillipsmarketing.biz>wrote: > Man, are you good....;) > > It now works as expected! > > One last question....the form shows three text boxes next to each other. > How can I change the html to look like this: > > [ ] [ ] / [ ] > > {text_box} space {text_box} / {text_box} > > It has something to do with format_output, but I don't understand how to > return a string to represent this layout. Also, how to control the size of > the text boxes. > > Thanks again!! > > Mark > > > On Fri, Apr 11, 2014 at 8:05 AM, Lucas Klassmann <lucasklassm...@gmail.com > > wrote: > >> Hi Mark, >> >> Because *TextInput *is a classe inside *forms *module and python is >> *case-sensitive*, try this: >> >> * forms.TextInput(attrs=attrs)* >> >> Cheers. >> >> >> On Fri, Apr 11, 2014 at 11:59 AM, Mark Phillips < >> m...@phillipsmarketing.biz> wrote: >> >>> Lucas, >>> >>> Thanks for your comment. >>> >>> I tried your suggestion, and got this error >>> >>> 'module' object has no attribute 'textInput' >>> >>> referring to the forms.textInput(attrs=attrs) in the widget class. >>> >>> I am only trying to replace three out of 16 fields in my Inventory model >>> with the custom widgets. I think your solution would require me to >>> enumerate all the other fields as well? I found this on the Internet - >>> http://collingrady.wordpress.com/2008/07/24/useful-form-tricks-in-django/, >>> which gave me the idea for how I wrote the form. >>> >>> I could be totally off base, so this is a great learning experience for >>> me! Thanks for your help! >>> >>> Mark >>> >>> >>> On Fri, Apr 11, 2014 at 7:37 AM, Lucas Klassmann < >>> lucasklassm...@gmail.com> wrote: >>> >>>> Hi! >>>> >>>> I will test you code, but for now, try rewrite the form class, this way: >>>> >>>> class MeasurementForm(forms.ModelForm): >>>> width = forms.DecimalField(widget=MeasurementWidget()) >>>> height = forms.DecimalField(widget=MeasurementWidget()) >>>> length = forms.DecimalField(widget=MeasurementWidget()) >>>> >>>> class Meta: >>>> model = Inventory >>>> >>>> Cheers. >>>> >>>> >>>> On Fri, Apr 11, 2014 at 11:25 AM, Mark Phillips < >>>> m...@phillipsmarketing.biz> wrote: >>>> >>>>> I looked at the MultiWidget and tried to implement following a couple >>>>> of examples, but I have run into a problem. I get this error when I try to >>>>> open the admin form - type object 'MeasurementWidget' has no >>>>> attribute 'attrs' >>>>> >>>>> widgets.py >>>>> class MeasurementWidget(forms.MultiWidget): >>>>> def __init__(self, attrs=None): >>>>> widgets = ( >>>>> forms.textInput(attrs=attrs), >>>>> forms.textInput(attrs=attrs), >>>>> forms.textInput(attrs=attrs), >>>>> ) >>>>> super(MeasurementWidget, self).__init__(widgets, attrs) >>>>> >>>>> def decompress(self, value): >>>>> if value: >>>>> frac = Fraction(value) >>>>> num = frac.numerator >>>>> denom = frac.denominator >>>>> whole = num/denom >>>>> if whole == 0: >>>>> whole = '' >>>>> numerator = num - (num/denom)*denom >>>>> return [whole, numerator, denom] >>>>> return ['', '', ''] >>>>> >>>>> def format_output(self, rendered_widgets): >>>>> return u''.join(rendered_widgets) >>>>> >>>>> def value_from_datadict(self, data, files, name): >>>>> valuelist = [widget.value_from_datadict(data, files, name + >>>>> '_%s' % i) for i, widget in enumerate(self.widgets)] >>>>> try: >>>>> if valuelist[0] == '': >>>>> valuelist[0] = 0 >>>>> numerator = int(valuelist[0]) * int(valuelist[2]) + >>>>> int(valuelist[1]) >>>>> denominator = int(valuelist[2]) >>>>> return Decimal(float(Fraction(numerator, denominator))) >>>>> except ValueError: >>>>> return "" >>>>> >>>>> models.py >>>>> class Inventory(models.Model): >>>>> location = models.ForeignKey(Location) >>>>> room = models.ForeignKey(Room, blank=True, null=True) >>>>> condition = models.ForeignKey(Condition) >>>>> status = models.ForeignKey(Status) >>>>> category = models.ForeignKey(Category) >>>>> length = models.DecimalField(max_digits=5, decimal_places=3, >>>>> default=0) >>>>> width = models.DecimalField(max_digits=5, decimal_places=3, >>>>> default=0) >>>>> height = models.DecimalField(max_digits=5, decimal_places=3, >>>>> default=0) >>>>> and other fields..... >>>>> >>>>> admin.py >>>>> class MeasurementForm(forms.ModelForm): >>>>> def __init__(self, *args, **kwargs): >>>>> super(MeasurementForm, self).__init__(*args, **kwargs) >>>>> self.fields['width'].widget = MeasurementWidget >>>>> self.fields['height'].widget = MeasurementWidget >>>>> self.fields['length'].widget = MeasurementWidget >>>>> >>>>> class Meta: >>>>> model = Inventory >>>>> >>>>> class InventoryAdmin(admin.ModelAdmin): >>>>> list_display = ('id','location', 'room', 'category', >>>>> 'description', 'condition', 'length', 'width', 'height', 'status', >>>>> 'sale_price', 'selling_costs', 'debt') >>>>> list_filter = ['category'] >>>>> search_fields = ['description'] >>>>> form = MeasurementForm >>>>> inlines = [NoteInline, ImageInline, EstimateInline] >>>>> >>>>> admin.site.register(Inventory, InventoryAdmin) >>>>> >>>>> I am really lost here. Does anyone have an easier way to override the >>>>> widgets on the admin form? >>>>> >>>>> Thanks, >>>>> >>>>> Mark >>>>> >>>>> >>>>> On Thu, Apr 10, 2014 at 7:09 PM, Lucas Klassmann < >>>>> lucasklassm...@gmail.com> wrote: >>>>> >>>>>> Hi! >>>>>> >>>>>> I never used this, but i found here and can be useful: >>>>>> >>>>>> >>>>>> https://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.MultiWidget >>>>>> >>>>>> Cheers. >>>>>> >>>>>> >>>>>> On Thu, Apr 10, 2014 at 10:56 PM, Mark Phillips < >>>>>> m...@phillipsmarketing.biz> wrote: >>>>>> >>>>>>> I hope I am using the right terminology.... >>>>>>> >>>>>>> I have a Decimal field in a model called 'width'. In the admin >>>>>>> screen, I would like to display this field as three text boxes like >>>>>>> this: >>>>>>> >>>>>>> width: [] []/[] >>>>>>> >>>>>>> so I can enter 2 1/8 for the width, and then have the code convert >>>>>>> that to 2.125 as a Decimal field and store that Decimal field in the >>>>>>> database. >>>>>>> >>>>>>> How would I go about doing this? >>>>>>> >>>>>>> Thanks, >>>>>>> >>>>>>> Mark >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Django users" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to django-users+unsubscr...@googlegroups.com. >>>>>>> To post to this group, send email to django-users@googlegroups.com. >>>>>>> Visit this group at http://groups.google.com/group/django-users. >>>>>>> To view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/django-users/CAEqej2MkiPYfjO4afqyWVr587AL5UczhuzJCLhgxeqjda8%2BcDw%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAEqej2MkiPYfjO4afqyWVr587AL5UczhuzJCLhgxeqjda8%2BcDw%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Lucas Klassmann >>>>>> Desenvolvedor de Software >>>>>> >>>>>> Email: lucasklassm...@gmail.com >>>>>> Web site: http://www.lucasklassmann.com >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Django users" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to django-users+unsubscr...@googlegroups.com. >>>>>> To post to this group, send email to django-users@googlegroups.com. >>>>>> Visit this group at http://groups.google.com/group/django-users. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/django-users/CAOz50pLMMRv8-boG1C0Rb7vriVnpO-G953Lbh0zoRhjG6-zsLQ%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAOz50pLMMRv8-boG1C0Rb7vriVnpO-G953Lbh0zoRhjG6-zsLQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Django users" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to django-users+unsubscr...@googlegroups.com. >>>>> To post to this group, send email to django-users@googlegroups.com. >>>>> Visit this group at http://groups.google.com/group/django-users. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/django-users/CAEqej2Onin-ONGCxnC6WLpO9cL66UoENiyopp2aPns0A%3D2JkWw%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAEqej2Onin-ONGCxnC6WLpO9cL66UoENiyopp2aPns0A%3D2JkWw%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> >>>> -- >>>> Lucas Klassmann >>>> Desenvolvedor de Software >>>> >>>> Email: lucasklassm...@gmail.com >>>> Web site: http://www.lucasklassmann.com >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Django users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to django-users+unsubscr...@googlegroups.com. >>>> To post to this group, send email to django-users@googlegroups.com. >>>> Visit this group at http://groups.google.com/group/django-users. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/django-users/CAOz50pK7Qu7YEB%3D3%2ByLRr%2Boh6nzST2o9bc0k3nt33%3DJ74-wmqA%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAOz50pK7Qu7YEB%3D3%2ByLRr%2Boh6nzST2o9bc0k3nt33%3DJ74-wmqA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Django users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to django-users+unsubscr...@googlegroups.com. >>> To post to this group, send email to django-users@googlegroups.com. >>> Visit this group at http://groups.google.com/group/django-users. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/django-users/CAEqej2NHjOXXaC5%3Dt8PXcR_4S-Kuu5hG0d%3Dy3Q32e3SbfnS-Jg%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAEqej2NHjOXXaC5%3Dt8PXcR_4S-Kuu5hG0d%3Dy3Q32e3SbfnS-Jg%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> >> >> -- >> Lucas Klassmann >> Desenvolvedor de Software >> >> Email: lucasklassm...@gmail.com >> Web site: http://www.lucasklassmann.com >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to django-users+unsubscr...@googlegroups.com. >> To post to this group, send email to django-users@googlegroups.com. >> Visit this group at http://groups.google.com/group/django-users. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/django-users/CAOz50pJNBMOrhQeCjtXYFHnchWfmDX17z1pg1Lv_rs6G5jKUrw%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAOz50pJNBMOrhQeCjtXYFHnchWfmDX17z1pg1Lv_rs6G5jKUrw%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to django-users+unsubscr...@googlegroups.com. > To post to this group, send email to django-users@googlegroups.com. > Visit this group at http://groups.google.com/group/django-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/CAEqej2PjEFkNac%3DoU%2B4LDqeQiDBn5cFCRb60knFGvoXfdW0nMw%40mail.gmail.com<https://groups.google.com/d/msgid/django-users/CAEqej2PjEFkNac%3DoU%2B4LDqeQiDBn5cFCRb60knFGvoXfdW0nMw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- Lucas Klassmann Desenvolvedor de Software Email: lucasklassm...@gmail.com Web site: http://www.lucasklassmann.com -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAOz50pJMdGdE1X4-KEbor%3DN8T8g4iSMVxVTiDatrc%2B8WpTdpvw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.