2012-09-07 47 views
1

試圖在django中實例化一個模型表單,我傳入一個實例並得到驗證錯誤,儘管數據是從前幾分鐘輸入的。忽略額外的字段,我試圖刪除它,問題依然存在。它從單獨的鍵值表中添加額外的字段。Django模型表單錯誤實例模型

的Django 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

你傳遞request.POST即使在視圖(else)後,當POST字典將是空的GET階段,所以自然會出現驗證錯誤

+0

您先生是個傳奇人物,比我們整個開發團隊的眼睛好>。< – Jharwood