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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to