我已经为表单完成了我的第一个验证器,我感觉这不是它应该完成的方式。
它有效,但它看起来像丑陋的代码,有人可以帮忙吗?
我的表格:
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
我的想法是查看名称是否在其他两个模型中作为名称存在,并在出现错误时引发错误。
答案 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("...")
除此之外,你的代码还可以!