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