正在處理這一個可能有點複雜,或者我只是困惑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)
當我將項目設置爲project = models.ForeignKey(Project)以強制它不允許空值時,里程碑未通過驗證。該錯誤缺少項目,因爲該項目在form.save運行之前不存在。除非有另一種方法來處理?是否可以運行form.save()並將最近創建的project_id傳回給formset? – jlarry 2010-11-06 03:28:10
現在我正在這樣做,以獲得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
我認爲,描述我的問題是使用這個例子。我怎樣才能在這個例子上運行一個乾淨的,這樣我就可以從第二個窗體驗證第一個窗體的值。 http://goo.gl/ADjpL – jlarry 2010-11-08 19:12:23