Django完整性错误处理

时间:2015-01-28 19:05:43

标签: python django

我创建了一个用户名注册的网站,名字,姓氏,电话号码等等。 我已经成功建立了与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)

3 个答案:

答案 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子句捕获唯一错误。这使用较少的数据库访问尝试。