2016-07-15 93 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.')