2015-01-28 2 views
1

Я создал сайт для регистрации пользователей с именем, фамилией, телефоном и т. Д. Я успешно установил соединение с базой данных MySQL. Мне нужна помощь в обработке IntegrityError в django, так как я новичок. Когда 2 пользователя вводят тот же номер телефона, django выводит меня на страницу отладки с большим количеством информации. Вместо этого я хочу уведомить пользователя тогда и там, что другой пользователь с тем же номером телефона уже существует. Просьба указать любые указатели на это. Ниже мой views.py файл, в котором я обрабатываю форму:Обработка ошибок целостности Django

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) 

ответ

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

Если вы не wan't перезаписать чистый метод и сделать это Whitin вашего мнения. ты можешь. (Не элегантный)

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) 
0

Прежде чем вы создадите объект, запросите db для существования этого номера телефона.

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, сообщение об ошибке будет отображаться пользователю.

+0

Вам нужно будет использовать транзакцию, или запрос не гарантирует, что телефон # не находится в базе данных при попытке вставить (условия гонки). И запрос БД может быть дорогостоящим. Обработка ошибки изящно была бы лучшим вариантом. –

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/за исключением пункта. Это использует меньше попыток доступа к базам данных.

Смежные вопросы