Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法在Ajax post请求中创建新的Django模型对象_Javascript_Jquery_Python_Django_Orm - Fatal编程技术网

Javascript 无法在Ajax post请求中创建新的Django模型对象

Javascript 无法在Ajax post请求中创建新的Django模型对象,javascript,jquery,python,django,orm,Javascript,Jquery,Python,Django,Orm,这是一种“我已经失去了x小时调试这类”的问题:( 以下jQueryJS代码在单击按钮时启动POST请求 $("#btn_create_tag").click(function(evt) { $.post("/tag/createAjax", { tagname: $("#txt_tag_name").val() }, function(data) { } ); }); 在此调用上执行的Django代码是: @suppress_logging_ou

这是一种“我已经失去了x小时调试这类”的问题:(

以下jQueryJS代码在单击按钮时启动POST请求

$("#btn_create_tag").click(function(evt) {
$.post("/tag/createAjax", { 
    tagname: $("#txt_tag_name").val()       
    },
    function(data) {
    }
);
});
在此调用上执行的Django代码是:

@suppress_logging_output
@login_required
def createAjax(request):
    if request.is_ajax() and request.method == 'POST':
        tagName = request.POST["tagname"]
        new_tag = Tag()
        new_tag.name = tagName
        new_tag.save()
        print "new tag with id %s has been created" % new_tag.id
该代码已成功执行(我正在检查空的或已经存在的名称,但这里并没有写得更清楚),但没有创建新的标记对象。 我甚至会在devserver的提示符上打印“已创建id为%s的新标记”,并且每次id增加一个时,都会显示支持,但对象不会存储在db中

当我执行

new_tag = Tag()
new_tag.name = tagName
new_tag.save()
在Django shell中,新的标记对象被定期创建,但在jQuery请求中,它并没有被创建

你知道发生了什么,要检查什么,如何调试这个

DB behind是postgresql8.3

欢迎提出任何建议:)

更新

我编写的UnitTest正在运行:

class AjaxTestCase(TestCase):
    def testAjaxCreateTag(self):
        tagNum = Tag.objects.filter(name="TEST_TAG").count()
        self.assertEqual(tagNum, 0)
        c = Client()
        c.post('/lookup/tag/createAjax', {'tagname': 'TEST_TAG'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
        tagNum = Tag.objects.filter(name="TEST_TAG").count()
        self.assertEqual(tagNum, 1)
更新2

嗯,今天早上,似乎一切正常,但代码没有改变。我一点也不喜欢这样:(

试试看

new_tag=Tag(name=tagName)
new_tag.save()

顺便说一句-你应该清理新的标记名,而不是直接从文章中获取它。这听起来很奇怪。你能仔细检查一下你的数据库设置吗?确保你在
settings.py
中使用了正确的数据库吗?还要编写一个单元测试,使用Django的来练习代码。在你的测试方法中,记得发送e> HTTP\u X\u请求带有
标题的\u用于
is\u ajax()
工作。

如果您正在使用TransactionMiddleware(请参阅),则不返回某种类型的HttpResponse将导致崩溃和回滚。

谢谢您的回答。我已经尝试过了,并且新建了\u tag=tag.objects.create(name=tagName)但它不工作:(我正在清理标记名,但为了问题的简单化,这一部分被省略了。您能捕获到数据库的输出sql吗?如何捕获?这是ajax请求,所以DjangLogging不会做这件事(据我所知)。我将尝试通过PostgresSQLFor MySQL记录所有内容。我使用MySQL代理将sql发送到控制台。也许你有一个类似于Postgres的工具?我会尝试。这真的很奇怪,特别是因为django应用程序已经正常工作了很长一段时间。我将编写单元测试。谜团会加深!你能尝试一个实验吗?Change
createAjax转换为处理direct
POST
而不是AJAX的普通方法。查看它是否有效(在开发和单元测试中)。还要看看调用视图后是否有可能回滚事务。非常感谢Manoj。在UTest成功后,我再次进行了Ajax调用并添加了标记。我不喜欢早上之后的这种综合症:(尽管如此,我还是会尝试重现这个问题,并找出它是错的……感谢您提供的信息。我使用的是TransactionMiddleware。另外,这个方法返回的是HttpResponse,但我没有在这里包含这段代码(我应该写下整个方法)。