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

1 に答える 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.

于 2012-09-07T16:13:44.393 に答える