2010-11-05 31 views
1

正在處理這一個可能有點複雜,或者我只是困惑Django的反對另一種形式的一個formset驗證領域的同時

我有一個頁面上有兩種形式。一個是表單,另一個是表單集。我的目標是根據表單中的字段驗證formset中的字段。我對目前發生的事情的猜測是,我正在通過Project將Form ID傳遞給formset的方法正在以某種方式發生,因爲它沒有被用於formset驗證。

它的錯誤出在

if target > project.target_date: 

異常值:「NoneType」對象有沒有屬性「target_date」

,目前可與出驗證碼:請注意,我設置的項目允許空在里程碑模型上。我寧願它不允許null,但這是我能想出如何將project_id傳遞給里程碑表單的唯一方法。

View.py

def ProjectAdd(request): #Finish the template 
    qs = Project.objects.none() 
    if request.method == 'POST': 
     form = ProjectAddForm(request.POST) 
     formset = MilestoneFormSet(request.POST) 
     if form.is_valid() and formset.is_valid(): 
      project = form.save() 
      instances = formset.save(commit=False) 
      for instance in instances: 
       instance.project_id = project.id 
       instance.save() 
      return HttpResponseRedirect(reverse('project.views.detail', args=(project.id,))) 
    else: 
     form = ProjectAddForm() 
     formset = MilestoneFormSet(queryset=qs) 
    return render_to_response('project/addProjectForm.html', { 
     'form': form, 
     'formset': formset, 
     'current_date': current_date, 
    }, context_instance=RequestContext(request)) 

Models.py

class Milestone(models.Model): 
    project = models.ForeignKey(Project, blank=True, null=True) 
    target_date = models.DateField('Target Date') 

forms.py

MilestoneFormSet = modelformset_factory(Milestone, extra=1, max_num=50) 

,我想該代碼與驗證工作。現在,一切都只是forms.py相同:

forms.py

class MilestoneForm(forms.ModelForm): 

    def clean(self): 
     if any(self.errors): 
      raise forms.ValidationError("") 
     data = self.cleaned_data 
     target = data["target_date"] 
     project = data["project"] 
     if target > project.target_date: 
      raise forms.ValidationError("Target Date is beyond the project target date - Project Target: %s" % target) 
     if target < project.start_date: 
      raise forms.ValidationError("Target Date is before the start date of the project - Project Start: %s" % project.start_date) 
     return data 

MilestoneFormSet = modelformset_factory(Milestone, form=MilestoneForm, extra=1, max_num=50) 

回答

1

的問題是Milestone.project可以None

當你做一個檢查if project is None: raise forms.ValidationError('No project is assigned to this milestone.'

我提到這是你前面的問題tooproject = data['project']遵循它,一定是錯過了:)。

+0

當我將項目設置爲project = models.ForeignKey(Project)以強制它不允許空值時,里程碑未通過驗證。該錯誤缺少項目,因爲該項目在form.save運行之前不存在。除非有另一種方法來處理?是否可以運行form.save()並將最近創建的project_id傳回給formset? – jlarry 2010-11-06 03:28:10

+0

現在我正在這樣做,以獲得project_id里程碑formset。 ---- project = form.save() instances = formset.save(commit = False) 例如在實例中: instance.project_id = project.id instance.save() – jlarry 2010-11-06 03:30:29

+0

我認爲,描述我的問題是使用這個例子。我怎樣才能在這個例子上運行一個乾淨的,這樣我就可以從第二個窗體驗證第一個窗體的值。 http://goo.gl/ADjpL – jlarry 2010-11-08 19:12:23

相關問題