django表单验证看起来像坏代码

时间:2013-12-09 21:09:27

标签: django validation styles

我已经为表单完成了我的第一个验证器,我感觉这不是它应该完成的方式。

它有效,但它看起来像丑陋的代码,有人可以帮忙吗?

我的表格:

class CountryForm(forms.ModelForm):
    """Form to create or edit Countries."""

    class Meta:
        model = Country

    def clean_name(self):
        raw_data = self.cleaned_data['name']
        data = raw_data.title()

        try:
            Province.objects.get(name=data).exists()
            raise forms.ValidationError("There is already a province with the name: %s") % data
        except:
            pass
        try:
            Region.objects.get(name=data).exists()
            raise forms.ValidationError("There is already a region with the name: %s") % data
        except:
            pass
    return data

我的想法是查看名称是否在其他两个模型中作为名称存在,并在出现错误时引发错误。

2 个答案:

答案 0 :(得分:1)

您在这里使用了错误的Queryset方法。 get()返回一个模型对象,该对象不具有exists()方法。您应该使用filter()

此外,exists()不会引发异常。所以你可以做一个正常的if

if Province.objects.filter(name=data).exists():
    raise forms.ValidationError(...)

请记住,clean方法将被调用以进行更新以及创建。在更新时,检查将失败,因为它将找到您正在编辑的同一实例。如果表单具有实例且实例具有pk值,则应绕过此检查:

if not (form.instance and form.instance.pk):

最后,您应该从不使用裸except语句。这将捕获所有异常,可能隐藏您的代码的一些实际问题。始终抓住您认为代码会引发的特定异常 - 在这种情况下,Province.DoesNotExist

答案 1 :(得分:0)

这不起作用,因为您将始终在clean_name函数中处理异常,并且永远不会引发验证异常!

而是这样做


if Province.objects.filter(name=data).exists() or Region.objects.filter(name=date).exists():
  raise forms.ValidationError("...")

除此之外,你的代码还可以!