Trying to instance a model form in django, I am passing in an instance and I get validation errors out, despite the data being entered from the very same form minutes prior. ignore the extra fields stuff I have tried removing it and the issue persists. It adds extra fields from a separate key value table.
Django Version 1.3
def edit(request,company_uuid,contact_uuid,address_uuid):
mcompany = get_object_or_404(models.Company, uuid = company_uuid)
extra_questions, extra_ids = get_questions(request, 2)
if request.method == 'POST': # If the form has been submitted...
form = forms.EditCompanyForm(request.POST,instance=mcompany, extra=extra_questions, extra_ids=extra_ids)
if form.is_valid():
fModel = form.save(commit = False)
for (question, answer) in form.extra_answers():
save_answer(request, question, answer, mcompany.uuid, 2)
form.save()
url = reverse('contacts_details',kwargs={'company_uuid':mcompany.uuid,
'address_uuid':address_uuid,
'contact_uuid':contact_uuid})
return HttpResponseRedirect(url)
else:
form = forms.EditCompanyForm(request.POST,instance=mcompany, extra=extra_questions, extra_ids=extra_ids)
return share.output_page(request,'contacts/edit.html',{'form': form,
'company_uuid':mcompany.uuid,
'address_uuid':address_uuid,
'contact_uuid':contact_uuid})
class EditCompanyForm(jsforms.JMSModelForm):
"""
The Company form with the contacts fields included
"""
name = forms.CharField(label = _('Company Name'),widget = forms.TextInput(attrs={'class':'large-input-box'}))
discount=forms.FloatField(widget = jsforms.StandardUnit("PC"),required=False)
allow_download = forms.BooleanField(required=False,label=_('Allow download'))
def __init__(self, *args, **kwargs):
extra = kwargs.pop('extra')
extra_id = kwargs.pop('extra_ids')
super(EditCompanyForm, self).__init__(*args, **kwargs)
for i, question in enumerate(extra):
settings = ExtraFieldSetup.objects.get(uuid=extra_id[i])
if settings.type == 2:
list = []
list_partial = str(settings.extra).split(':')
for choice in list_partial:
x = choice, choice
list.append(x)
self.fields['custom_%s' % i] = forms.ChoiceField(choices=list, label=question, required=False)
else:
self.fields['custom_%s' % i] = forms.CharField(label=question, required=False)
def extra_answers(self):
for name, value in self.cleaned_data.items():
if name.startswith('custom_'):
yield (self.fields[name].label, value)
class Meta:
model = models.Company
exclude = ('company', 'otherdetails', 'jms_code', 'logo', 'hidden', 'user')