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
<[email protected]>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 <[email protected]
> > 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 <
>> [email protected]> 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 <
>>> [email protected]> 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 <
>>>> [email protected]> 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 <
>>>>> [email protected]> 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 <
>>>>>> [email protected]> 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 [email protected].
>>>>>>> To post to this group, send email to [email protected].
>>>>>>> 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: [email protected]
>>>>>> 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 [email protected].
>>>>>> To post to this group, send email to [email protected].
>>>>>> 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 [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>> 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: [email protected]
>>>> 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 [email protected].
>>>> To post to this group, send email to [email protected].
>>>> 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 [email protected].
>>> To post to this group, send email to [email protected].
>>> 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: [email protected]
>> 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 [email protected].
>> To post to this group, send email to [email protected].
>> 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 [email protected].
> To post to this group, send email to [email protected].
> 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: [email protected]
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 [email protected].
To post to this group, send email to [email protected].
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.

Reply via email to