【问题标题】:Django Ajax post 500 internal errorDjango Ajax 发布 500 内部错误
【发布时间】:2016-11-19 00:53:31
【问题描述】:

我希望你能帮助我,我试图在不使用 ajax 重新加载页面的情况下制作一个 django 发布表单,但是提交时出现错误 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(内部服务器错误)

我认为我认为可能缺少某些东西,买我不知道,你帮帮我吗?

编辑:添加回溯

环境:

请求方法:GET 请求 URL: http://127.0.0.1:8000/cobro/agregar_concepto/

Django 版本:1.9.7 Python 版本:2.7.11 已安装的应用程序: ('django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages','django.contrib.staticfiles','entrada', “cobro”、“catalogo”、“selectize”、“smart_selects”)已安装 中间件:('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')

追溯:

文件“C:\Python27\lib\site-packages\django\core\handlers\base.py”在 获取响应 158. %(回调。模块,view_name))

异常类型:ValueError at /cobro/agregar_concept/ 异常 值:视图 cobro.views.addconcept_product 没有返回 HttpResponse 对象。它返回 None 。

【问题讨论】:

  • 请显示完整的错误回溯。我认为出现了一些异常。
  • 当然,我编辑了帖子。
  • 因此,您从视图中返回 None 的错误很明显,这就是您收到异常和 500 状态的原因。至少返回类似 return HttpResponse('Product Created !')
  • 你能解释一下如何解决这个问题吗,我还在学习这个,有时我不能这么清楚地看到错误,也感谢你的回答。

标签: ajax django django-forms django-views


【解决方案1】:

您的视图不完整: 正如异常所述:视图 cobro.views.addconcept_product 没有返回正确的 HttpResponse 对象。

return HttpResponseRedirect('/thanks/')

【讨论】:

  • 哦,我明白了,但在这种情况下,我使用 ajax 来避免重定向或重新加载页面,所以还需要响应对象吗?或者因为我的脚本中缺少一些东西来发帖
  • 你必须返回一个有效的 HttpResponse 或一个 JsonResponse
【解决方案2】:

您是否正在新窗口中查看您提供的异常?因为它显示 “请求方法: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.')

【讨论】:

    【解决方案3】:

    用类似的东西更新你的退货声明。

    return HttpResponse('Product Created !')
    

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

    先导入

    from django.http import JsonResponse
    

    然后返回您的回复

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

    引发异常是因为如果方法不是 POST,则您没有处理条件,并且您正在提交 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' %}',
        ....
        });
    

    【讨论】:

    • 感谢您的回答,我试过了,但我得到了同样的例外。
    • 也将你的 ajax type: 'POST', 属性更改为 method: 'POST', 并在你的方法未发布时处理条件,例如添加 else: JsonResponse({'error': 'Only post allowed'})
    • 是的,但我仍然收到 500 错误,这就是我发布所有代码的原因,哈哈,我想也许我错了其他东西。
    • 我是根据这个教程来制作的:youtube.com/watch?v=KgnPSmrQrXI&index=1
    猜你喜欢
    • 2014-05-06
    • 2017-06-27
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多