2016-07-15 53 views
0

我希望你能帮助我,即时尝试做一个Django发布表单,而无需重新加载页面使用AJAX,但即时通讯错误500提交时,你能帮我解决这个问题,这是我的代码:Django Ajax后500内部错误

models.py

class ProductoConcepto(models.Model): 
    producto = models.ForeignKey(Producto) 
    orden = models.ForeignKey(Cobro) 
    cantidad = models.FloatField() 

urls.py

from django.conf.urls import patterns, include, url 
from django.contrib import admin 
from cobro import views 

urlpatterns = [ 
    url(r'^cobro/agregar_concepto/$', views.addconcept_product, name='add_concepto'), 
] 

views.py

def addconcept_product(request): 

    if request.method == 'POST': 

     if form.is_valid(): 
      producto = request.POST['producto'] 
      orden = request.POST['orden'] 
      cantidad = request.POST['cantidad'] 

      ProductoConcepto.objects.create(producto=producto, orden=orden, cantidad=cantidad) 

      return HttpResponse('') 

模板

<div class="modal inmodal fade" id="myModal1" tabindex="-1" role="dialog" aria-hidden="true"> 
      <div class="modal-dialog modal-m"> 
       <div class="modal-content"> 
        <div class="modal-header"> 
         <button type="button" class="close" data-dismiss="modal"> 
          <span aria-hidden="true">&times;</span> 
          <span class="sr-only">Cerrar</span> 
         </button> 
         <h3 class="modal-title">Agregar nuevo concepto</h3> 
        </div> 
        <div class="modal-body"> 
         <p>Datos de concepto a agregar:</p> 
         <div class="doctorformstyle"> 
         <form id='formulario-modal' method='post' enctype='multipart/form-data'> 
          {% csrf_token %} 
          <ul>{{form2.as_p}}</ul> 

<!-- rendered form2 fields: <select id="id_producto" name="producto"><option value="1" selected="selected">object</option></select> --> 
<!-- form2 fields: <select id="id_orden" name="orden"> 
<option value="1" selected="selected">object</option> 
</select> --> 
<!-- form2 fields: <input id="id_cantidad" name="cantidad" step="any" type="number"> --> 

          <div class="row align-center"> 
           <input type='submit' name="save1" value='Guardar' class="btn btn-w-m btn-primary"/> 
          </div> 

         </form> 
</div> 
        </div> 
       </div> 
      </div> 
     </div> 

<script type="text/javascript"> 
    $(document).on('submit', '#formulario-modal', function(e){ 
      e.preventDefault(); 
      $.ajax ({ 
       type: 'POST', 
       url: '{% url 'add_concepto' %}', 
       data: { 
        producto: $('#id_producto').val(), 
        orden: $('#id_orden').val(), 
        cantidad: $('#id_cantidad').val(), 
        csrfmiddlewaretoken: '{{ csrf_token }}', 
       }, 
       sucess:function(){ 
        alert("OK"); 
       } 
      }) 
    }); 

</script> 

这是错误:POST http://127.0.0.1:8000/cobro/agregar_concepto/ 500(内部服务器错误)

我想,或许真的是我的观点失踪,买我不知道,CAL,你能帮我吗?

编辑:回溯添加

Environment:

Request Method: GET Request URL: http://127.0.0.1:8000/cobro/agregar_concepto/

Django Version: 1.9.7 Python Version: 2.7.11 Installed Applications: ('django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'entrada', 'cobro', 'catalogo', 'selectize', 'smart_selects') Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware')

Traceback:

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 158. % (callback.module, view_name))

Exception Type: ValueError at /cobro/agregar_concepto/ Exception Value: The view cobro.views.addconcept_product didn't return an HttpResponse object. It returned None instead.

+0

请出示完整的错误回溯。我认为一些例外情况正在升温。 – kapilsdv

+0

当然,我编辑的帖子。 –

+0

因此,从错误中清楚你从视图中返回None,这就是为什么你得到异常和500状态.Atleast返回类似于返回HttpResponse('Product Created!') – kapilsdv

回答

0

您的观点是不完整: 由于异常状态:视图cobro.views.addconcept_product没有返回一个适当的HttpResponse对象。

return HttpResponseRedirect('/thanks/') 
+0

噢,我看到了,但在这种情况下,我使用ajax来避免重定向或重新加载页面,所以仍然需要响应对象?或者这是缺少在我的脚本中的东西,使后 –

+0

你必须返回一个有效的HttpResponse或JsonResponse – acidjunk

0

用类似的东西来更新你的return语句。

return HttpResponse('Product Created !') 

此外,当你使用ajax时,你也可以返回一个JsonResponse。

首先导入它

from django.http import JsonResponse 

,然后返回你的反应

JsonResponse({'success': 'Product created'}) 

唯一的例外是越来越凸起,因为你不处理的情况,如果该方法不是帖子,您要提交GET请求。

处理无效格式的案例,如果方法不是POST。

def addconcept_product(request): 

if request.method == 'POST': 

    if form.is_valid(): 
    .... 

     return JsonResponse({'success': 'Product created'}) 
    else: 
     return JsonResponse({'error': 'InValid Form.Product Creation Failed'}) 
else: 
    return JsonResponse({'error': 'Only POST method allowed'}) 

还使用ajax方法属性,而不是类型。

$.ajax ({ 
      method: 'POST', 
      url: '{% url 'add_concepto' %}', 
    .... 
    }); 
+0

感谢您的回答,我试过,但我得到相同的例外。 –

+0

你用JsonResponse试过了吗? – kapilsdv

+0

同样改变你的ajax类型:'POST','method'的属性'POST',并且处理这个条件,如果你的方法没有发布,比如添加else:JsonResponse({'error':'只允许发布post '})' – kapilsdv

0

您是否正在查看您在新窗口中提供的例外情况?因为它显示 “请求方法:GET”,这不应该通过您的ajax函数发生。

修改您的视角以这样的:

def addconcept_product(request): 

    if request.method == 'POST': 

     if form.is_valid(): 
      producto = request.POST['producto'] 
      orden = request.POST['orden'] 
      cantidad = request.POST['cantidad'] 

      ProductoConcepto.objects.create(producto=producto, orden=orden, cantidad=cantidad) 

      return HttpResponse('Product Created') 
     else: 
      return HttpResponse('Product Creation failed') 
    else: 
     return HttpResponse('Failed: Post requests only.')