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