2013-04-13 4 views
0

jquery를 통해 내 백엔드에 게시물을 만들고 있습니다. 먼저 서약서가 이미 만들어 졌는지 확인하려고합니다. 그렇지 않다면 하나를 만듭니다.장고 유효성 검사 오류 없음 예외 제공

@csrf_exempt 
def pledgeReceive(request): 
fname = request.POST.get('fname', '') 
lname = request.POST.get('lname', '') 
participantName = request.POST.get('participantName', '') 
participantID = request.POST.get('participantID', '') 
ppl = request.POST.get('ppl', '') 
maxi = request.POST.get('maxi', '') 

sponsor = fname + ' ' + lname 
participant_obj = Participant.objects.get(pk = participantID) 

try: 
    pledge = Pledge.objects.get(sponsor = sponsor, participant = participant_obj, pledge_amount = ppl, max_pledge_amount = maxi, datetime = datetime.now()) 
except Pledge.DoesNotExist: 
    pledge = Pledge(sponsor = sponsor, participant = participant_obj, pledge_amount = ppl, max_pledge_amount = maxi, datetime = datetime.now()) 
    pledge.save() 

response = HttpResponse() 
response.content = serialized_obj = serializers.serialize('json', [ pledge, ]) 
response['Content-Type'] = 'application/json' 
return response 

500 개의 내부 서버 오류가 발생합니다. 다음과 같은 추적 :

ValidationError at /pledgeReceive/ 
No exception supplied 
    Traceback: 
File "/home/vtrelayc/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/vtrelayc/lib/python2.6/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    77.   return view_func(*args, **kwargs) 
File "/home/vtrelayc/projects/relay/relayapp/views.py" in pledgeReceive 
    461. pledge.save() 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/base.py" in save 
    463.   self.save_base(using=using, force_insert=force_insert, force_update=force_update) 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/base.py" in save_base 
    551.     result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/manager.py" in _insert 
    203.   return insert_query(self.model, objs, fields, **kwargs) 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/query.py" in insert_query 
    1593.  return query.get_compiler(using=using).execute_sql(return_id) 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in execute_sql 
    911.   for sql, params in self.as_sql(): 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in as_sql 
    872.     for obj in self.query.objs 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/fields/__init__.py" in get_db_prep_save 
    873.   return connection.ops.value_to_db_decimal(self.to_python(value), 
File "/home/vtrelayc/lib/python2.6/site-packages/django/db/models/fields/__init__.py" in to_python 
    850.    raise exceptions.ValidationError(msg) 

Exception Type: ValidationError at /pledgeReceive/ 

except Pledge.DoesNotExist:과 함께 예외를 제공합니까?

+0

'save()'전에'pledge.full_clean()'을 수행하면 정확한 오류를 알 수 있습니다. – karthikr

답변

1

get_or_create을 사용하지 않는 이유는 무엇입니까? 그것은 당신이하려고하는 것에 대한 지름길입니다.

pledge, created = Pledge.objects.get_or_create(sponsor = sponsor, participant = participant_obj, pledge_amount = ppl, max_pledge_amount = maxi, datetime = datetime.now()) 

지금 당신은 당신이 개체가 생성되거나 인출되었는지 여부를 알 수있는 pledge 객체와 부울, created을 보유하고 있습니다.

그 밖의 오류는 아마도 Pledge 개체가 예상하는 형식으로 캐스팅하지 않고 GET 매개 변수를 가져 오는 것만으로 인해 발생했을 수 있습니다. 대부분의 필드가 문자열을 기대하지는 않지만 문자열로 전달됩니다. 어쩌면 폼을 사용하거나 (유효성 검사/타입 캐스팅에 내장되어 있기 때문에) GET 매개 변수를 올바른 유형으로 수동 변환하십시오.

1

ValidationError 예외는 데이터 형식 모델 필드 유효성 검사를 실패 할 때 발생하지만이 form.is_valid()를 사용하거나하지 때문에 입력 값을 검증 어떤 검증이 No Exception Supplied에 발생합니다. Pledge.DoesNotExist조차도 쿼리의 지정된 매개 변수에 대해 개체를 찾을 수없는 경우에만 검사하기 때문에 오류를 catch 할 수 없습니다.

코드에 따르면 잘못된 값을 발견했습니다.

ppl = request.POST.get('ppl', '') 
maxi = request.POST.get('maxi', '') 

위의 코드가 잘못된 경우 정수를 전달합니다. 그러나 당신은 int가 아닌 문자열을 전달하는 것을 모릅니다. 내가 당신의 외래 키에 대한 값을 전달하는 경우, 모델 코드 패턴을 알거나해야도 확인 날짜하지 않는

ppl = int(request.POST.get('ppl', 0)) 
maxi = int(request.POST.get('maxi', 0)) 

여야가 매우 민감 때문. CharField가 필요하지 않으면 처리 할 수 ​​있기 때문에 CharField에 대해 걱정할 필요가 없습니다. 그러나이 오류를 처리 할 수없는 경우 form을 사용하는 것이 좋습니다.

관련 문제