用异常增强is_valid()

1 投票
1 回答
645 浏览
提问于 2025-04-17 13:05

我有一个Django的字符字段,这个字段会通过is_valid()方法来检查。用户需要在这个字段里输入一个有效的逻辑表达式,所以我写了一个解析的方法,如果表达式不正确,就会抛出一个异常。

我想知道怎么改进is_valid()方法,让它能够处理这个异常,并向用户显示一个错误信息,告诉他们他们的查询是错误的。

我看过这篇文章(https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute),但是还是不知道该怎么做。

        try:
        job = Job(user=request.user)  # set the current user
        form = JobForm(request.POST, instance=job)

        if form.is_valid():
            form.save()
            job.execute()
            messages.success(request, u'A new job with the query "{query}" was created.'.format(query=job.query))
            return HttpResponseRedirect(reverse('job-index'))

        return self.render_to_response({'job_form': form, 'is_new': True})
    except ParseError:
        return self.render_to_response({'job_form': form, 'is_new': True})

我想在is_valid()方法里面使用try...except块,想问问有没有人能给点建议?

1 个回答

3

你自己已经给出了问题的答案——你可以创建自己的表单(或者模型表单),并且可以在这个表单的字段上进行自定义验证,使用它的 clean_'字段名'() 方法。举个例子,假设你的模型是:

class Job(models.Model):
    expression_field = models.CharField(...)
    ...

你可以创建一个 forms.py 文件:

class JobForm(forms.ModelForm):
    pass
    class Meta:
        model = Job 

    def clean_expression_field(self):
         # You perform your custom validation on this field in here, 
         # raising any problems
         value = self.cleaned_data['expression_field']
         if value is 'really_bad':
              raise forms.ValidationError("bad bad bad")
         return value

然后像你在例子中那样在你的 views.py 中使用它。如果用户输入的值不符合你的标准,系统会自动抛出一个异常。

撰写回答