如何根据FK字段验证Django Form字段 [英] How to validate a Django Form field against a FK field

查看:145
本文介绍了如何根据FK字段验证Django Form字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个验证规则,如果(里程碑)对象target_date大于项目target_date,则传递错误。问题是没有提出任何错误。



为简单起见,

models.py

  class Project(models.Model):
target_date = models.DateField()

class Milestone(models.Model):
project = models.ForeignKey(Project)
target_date = models.DateField()

Forms.py

 类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

views.py(删除不相关的代码)

  def MilestoneManage(request,如果request.method =='POST':
formset = MilestoneFormSet(request.POST,prefix ='new')
if formset.is_valid():
newMiles = formset.save(commit = False)
for newMiles:
new.project_id = project.id
new.save ()
return HttpResponseRedirect(reverse('project.views.detail',args =(project.id,)))
else:
formset = MilestoneFormSet2(queryset = qs,prefix =' new')
return render_to_response('project / manageMilestones.html',{
'formset':formset,
},context_instance = RequestContext(requ est))


解决方案

这应该起作用。

  def clean_target_date(self):
#V-- typo (cleand_data => cleared_data)
tdate = self.cleaned_data ['target_date']
project = self.instance.project
#项目允许空值,所以先检查一下。
如果项目为None:
raise forms.ValidationError(没有与此里程碑关联的项目)
#V--执行属性查找,不要使用查询查找语法
if tdate> project.target_date:
raise forms.ValidationError(Target Date is outside or project target date。)
return tdate


I am attempting to create a validation rule that passes an error if the (milestone)objects target_date is greater then the projects target_date. The issue is that none of the errors are being raised.

For simplicities sake,

models.py

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

views.py(dropped unrelated code)

def MilestoneManage(request, project_id):
    qs = Project.objects.none()
    if request.method == 'POST':
        formset = MilestoneFormSet(request.POST, prefix='new')
        if formset.is_valid():
            newMiles = formset.save(commit=False)
            for new in newMiles:
                new.project_id = project.id
                new.save()
            return HttpResponseRedirect(reverse('project.views.detail', args=(project.id,)))
    else:
        formset = MilestoneFormSet2(queryset=qs, prefix='new')
    return render_to_response('project/manageMilestones.html', {
        'formset': formset,
    }, context_instance=RequestContext(request))

解决方案

This should work. See inline comments for more info on what was changed.

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

这篇关于如何根据FK字段验证Django Form字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆