Jharwood
Jharwood

Reputation: 1056

Django Model Form Error on instance with model

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

Upvotes: 1

Views: 279

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599470

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.

Upvotes: 1

Related Questions