Problem with ModelFormSet
In short, I have been having a hard time getting a ModelFormSet to
save. The formset is created from a queryset, and it's only intended
to edit one field of existing objects.
After a long string of mistakes and fixes, I'm finally stumped. The
following bit of code produces a TypeError exception about converting
a float to a decimal, but in my forms I'm not editing float or decimal
fields...only one CharField:
Code:
if request.method == 'POST':
formset = RetainStatusFormSet(request.POST, request.FILES,)
if formset.is_valid():
try:
instances = formset.save()
except Exception, err:
print type(err)
print err.message
###
Exception:
<type 'exceptions.TypeError'>
Cannot convert float to Decimal. First convert the float to a string
###
I will paste my code here, as much as I think is relevant, with the
most relevant code on top. As you can see in the request.POST that I
paste at the very end, there are only the usual management form
values, one string value per form, and one ID value per form being
passed. I have not a clue where this TypeError is coming from.
###
def newsession(request):
RetainStatusFormSet = modelformset_factory(Retain,
RetainStatusChangeForm,
exclude=('retain',
'date',
'lot',
'sub_lot',
'amount',
'notes',
'content_type',
'object_id',
'product'),
extra=0)
if request.method == 'POST':
formset = RetainStatusFormSet(request.POST, request.FILES,)
if formset.is_valid():
try:
instances = formset.save()
except Exception, err:
print type(err)
print err.message
return HttpResponseRedirect('/qc/newsession')
else:
formset = RetainStatusFormSet(queryset=
Retain.objects.select_related
().filter(status='Pending'))
return render_to_response('qc/newsession.html',
{'formset': formset,},
context_instance= RequestContext
(request))
class RetainStatusChangeForm(forms.ModelForm):
"""
A form to select a status for a retain.
"""
status = forms.ChoiceField(widget=RetainStatusChangeWidget,
choices=([
['Passed',''],
['Rejected',''],
['Resample',''],
['Hold',''],
['Pending','']
]),
initial='Passed'
)
class Meta:
model = Retain
fields = ['status']
class RetainStatusChangeRenderer(widgets.RadioFieldRenderer):
def render(self):
"""Outputs table cells for this set of radio fields."""
return mark_safe(u'%s' % u'\n'.join([u'<td
class="qcradiobutton">%s</td>'
% force_unicode(w) for w in self]))
class RetainStatusChangeWidget(widgets.RadioSelect):
renderer = RetainStatusChangeRenderer
class Retain(models.Model):
"""
Data related to the retained sample of a production lot.
"""
retain = models.PositiveSmallIntegerField()
date = models.DateField("Date on which product was QCed")
lot = models.PositiveIntegerField()
sub_lot = models.PositiveSmallIntegerField(blank=True, null=True)
status = models.CharField(max_length=25)
amount = models.DecimalField(max_digits=6,
decimal_places=2,
blank=True, null=True)
notes = models.TextField(blank=True, null=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
product = generic.GenericForeignKey('content_type', 'object_id')
class Meta:
ordering = ['-date', '-retain']
###############
# and the template
###############
<form method="POST" action="/qc/newsession/">
{{ formset.management_form }}
<table class="sortable">
<tr>
<th class="qcheaders">Retain</th>
<th class="qcheaders">Number</th>
<th class="qcheaders">Lot</th>
<th class="qcheaders">Amount</th>
<th class="qcheaders">Reference</th>
<th class="qcheaders" "sorttable_nosort">Passed</th>
<th class="qcheaders" "sorttable_nosort">Rejected</th>
<th class="qcheaders" "sorttable_nosort">Resample</th>
<th class="qcheaders" "sorttable_nosort">Hold</th>
<th class="qcheaders" "sorttable_nosort">Pending</th>
</tr>
{% for form in formset.forms %}
<tr>
<td class="qcbody"><a href="/flavorbase/
{{ form.instance.product.id }}">{{ form.instance.retain }}</a></td>
<td class="qcbody">{{ form.instance.product.number }}</td>
<td class="qcbody">{{ form.instance.amount }}</td>
<td class="qcbody">{{ form.instance.lot }}</td>
<td class="qcbody">{{ form.instance.product.retains.all.1 }}</td>
<!--
This variable will output cells for all the radio buttons.
They have the class "qcradiobutton" and contain nothing but a form
element.
-->
{{ form }}
</tr>
{% endfor %}
</table>
<p><input type="submit" value="Update Statuses" /></p>
</form>
##################################################
# I get the following if I print request.POST after a submission
#formatted for readability
<QueryDict: {
u'form-1-id': [u'10723'],
u'form-TOTAL_FORMS': [u'3'],
u'form-0-status': [u'Resample'],
u'form-2-id': [u'10722'],
u'form-0-id': [u'10724'],
u'form-1-status': [u'Rejected'],
u'form-INITIAL_FORMS': [u'3'],
u'csrfmiddlewaretoken': [u'###########'],
u'form-2-status': [u'Passed']}>
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=.
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home