如何根据FK字段验证Django表单字段
我试图创建一个验证规则,如果(里程碑)对象的目标日期大于项目的目标日期,则该规则会传递一个错误。问题是没有任何错误被提出 为了简单起见 models.py如何根据FK字段验证Django表单字段,django,validation,forms,Django,Validation,Forms,我试图创建一个验证规则,如果(里程碑)对象的目标日期大于项目的目标日期,则该规则会传递一个错误。问题是没有任何错误被提出 为了简单起见 models.py class Project(models.Model): target_date = models.DateField() class Milestone(models.Model): project = models.ForeignKey(Project) target_date = models.DateFiel
class Project(models.Model):
target_date = models.DateField()
class Milestone(models.Model):
project = models.ForeignKey(Project)
target_date = models.DateField()
Forms.py
class MilestoneAddForm(forms.ModelForm):
class Meta:
model = Milestone
def clean_target_date(self):
tdate = self.cleaned_data['target_date']
if tdate > self.instance.project.target_date
raise forms.ValidationError("Target Date is outside or project target date.")
return tdate
py(删除的无关代码)
这应该行得通。有关更改内容的更多信息,请参阅内联注释
def clean_target_date(self):
# V-- typo (cleand_data => cleaned_data)
tdate = self.cleaned_data['target_date']
project = self.instance.project
# project allows for nulls, so check that first.
if project is None:
raise forms.ValidationError("There's no project associated with this milestone.")
# V-- Do an attribute lookup, don't use the query lookup syntax
if tdate > project.target_date:
raise forms.ValidationError("Target Date is outside or project target date.")
return tdate
确切的错误是什么?请您提供实际运行的代码(上面至少有两个语法错误)。@Dronestudios:您确定target_date大于项目的target_date吗?如果调试到它会发生什么?在django还是一个相对较新的版本,而我的调试foo目前很弱。我很可能需要一点时间才能弄清楚到底发生了什么。似乎没有调用此代码。可能是这样,请尝试在
cleaned\u target\u date
的开头添加raise
。如果没有看到异常,则不会调用它。如果发生这种情况,请使用您的里程碑
模型定义更新您的问题。是的,看起来即使这样做也不会发生。这可能是因为使用了表单集吗?添加了视图。是的,它在我的标准表单上工作。表单集肯定有不同之处。
def clean_target_date(self):
# V-- typo (cleand_data => cleaned_data)
tdate = self.cleaned_data['target_date']
project = self.instance.project
# project allows for nulls, so check that first.
if project is None:
raise forms.ValidationError("There's no project associated with this milestone.")
# V-- Do an attribute lookup, don't use the query lookup syntax
if tdate > project.target_date:
raise forms.ValidationError("Target Date is outside or project target date.")
return tdate