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

这有点“我已经失去x小时调试这个”的问题/问题:(

以下jQuery js代码在按钮单击时启动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 

该代码执行成功(我正在检查空的或已经存在的名称,但是这里没有写得更清楚),但是没有创建新的Tag对象。 我甚至在devserver的提示符下打印了“已创建id%s的新标记”,并且每次ID增加为1时,如同所设想的那样,但对象不存储在db中。

当我执行

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

从Django shell开始,新的Tag对象是定期创建的,但是从jQuery请求来看,它并没有被创建。

知道什么是wront,要检查什么,如何调试这….

后面的DB是PostgresSQL 8.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) 

Update2

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

这听起来很奇怪。 你能仔细检查你的数据库设置吗? 确保您在settings.py中使用正确的数据库? 还要编写一个unit testing来使用Django的测试客户端来练习代码。 在您的测试方法中,记得发送is_ajax()HTTP_X_REQUESTED_WITH标头。

如果您正在使用TransactionMiddleware(请参阅http://docs.djangoproject.com/en/dev/topics/db/transactions/ ),那么不返回某种类型的HttpResponse将导致崩溃和回滚。

尝试

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

顺便说一句 – 您应该清理新的标记名,而不是直接从POST中获取它