1

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')

1 Answer 1

1

You're passing in request.POST even in the GET stage of the view (after the else), when the POST dictionary will be empty, so naturally there will be validation errors.

Sign up to request clarification or add additional context in comments.

1 Comment

you sir are a legend, with better eyes than our whole dev team >.<

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.