我创建了一个用户名注册的网站,名字,姓氏,电话号码等等。 我已经成功建立了与MySQL数据库的连接。我想要关于django中IntegrityError处理的帮助,因为我是新手。 当2个用户输入相同的电话号码时,django将我带到调试页面,其中包含大量信息。相反,我想通知用户那里已经存在具有相同电话号码的另一个用户。请提供有关此问题的任何指示。 以下是我处理表单的views.py文件:
from django.shortcuts import render
from formProcessing.forms import UserForm
def form(request):
#This is using regular Django forms
#print request.POST
#form = EmailForm(request.POST or None)
#This is using model forms
form = UserForm(request.POST or None)
if form.is_valid():
new_instance = form.save(commit=True)
new_instance.save()
context = {"form": form }
template = "form.html"
return render(request,template,context)
答案 0 :(得分:2)
在您的UserForm
中,您可以覆盖数字属性的简洁方法,让我们说您的属性被称为' number
'
class UserForm(ModelForm):
#your user form attributes and stuff
def clean_number(self, value):
user_number = value
number_occurrences = User.objects.filter(number=user_number).count()
if number_occurrences > 0:
raise forms.ValidationError("You number is already taken by other user")
return self.cleaned_data
检查有关form validation
的django文档如果你不想覆盖干净的方法,并在你的视野中做到这一点。您可以。 (不优雅)
def form(request):
#This is using regular Django forms
#print request.POST
#form = EmailForm(request.POST or None)
#This is using model forms
number = request.POST.get('telephone')
number_occurrences = User.objects.filter(number=user_number).count()
if number_occurrences > 0:
context = {'error':'Number already exist'}
return render(request,template,context)
form = UserForm(request.POST or None)
if form.is_valid():
new_instance = form.save(commit=True)
new_instance.save()
context = {"form": form }
template = "form.html"
return render(request,template,context)
答案 1 :(得分:0)
在创建对象之前,请在数据库中查询该电话号码是否存在。
if form.is_valid():
ph_number = #"Phone number from form"
if User.objects.filter(phone_number = ph_number).first():
return HttpResponse("The number already exists.")
new_instance = form.save(commit=True)
new_instance.save()
first()
方法返回查询集的索引0。因此,如果查询集中有元素0,则会向用户显示错误消息。
答案 2 :(得分:0)
你可以用字段验证做一些事情,虽然我不确切知道你的错误是什么,或者模型是如何设计的。 无论如何,在尝试保存之前,您可以尝试查找该值是否唯一(即,查看是否存在具有相同数字的另一条记录);这可能是最干净的。 https://docs.djangoproject.com/en/1.7/ref/forms/validation/#cleaning-a-specific-field-attribute
如下所示:
def clean_telephone(self):
n = User.objects.filter(telephone=self.cleaned_data['telephone']).count()
if n > 0:
raise forms.ValidationError("telephone number is already in database")
return data
或者您可以尝试保存它并使用try / except子句捕获唯一错误。这使用较少的数据库访问尝试。