Javascript 无法在Ajax post请求中创建新的Django模型对象
这是一种“我已经失去了x小时调试这类”的问题:( 以下jQueryJS代码在单击按钮时启动POST请求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
$("#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的来练习代码。在你的测试方法中,记得发送标题的\u用于is\u ajax()
工作。如果您正在使用TransactionMiddleware(请参阅),则不返回某种类型的HttpResponse将导致崩溃和回滚。谢谢您的回答。我已经尝试过了,并且新建了\u tag=tag.objects.create(name=tagName)但它不工作:(我正在清理标记名,但为了问题的简单化,这一部分被省略了。您能捕获到数据库的输出sql吗?如何捕获?这是ajax请求,所以DjangLogging不会做这件事(据我所知)。我将尝试通过PostgresSQLFor MySQL记录所有内容。我使用MySQL代理将sql发送到控制台。也许你有一个类似于Postgres的工具?我会尝试。这真的很奇怪,特别是因为django应用程序已经正常工作了很长一段时间。我将编写单元测试。谜团会加深!你能尝试一个实验吗?ChangecreateAjax将code>转换为处理directPOST
而不是AJAX的普通方法。查看它是否有效(在开发和单元测试中)。还要看看调用视图后是否有可能回滚事务。非常感谢Manoj。在UTest成功后,我再次进行了Ajax调用并添加了标记。我不喜欢早上之后的这种综合症:(尽管如此,我还是会尝试重现这个问题,并找出它是错的……感谢您提供的信息。我使用的是TransactionMiddleware。另外,这个方法返回的是HttpResponse,但我没有在这里包含这段代码(我应该写下整个方法)。