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

时间:2010-08-21 11:14:10

标签: javascript jquery python django orm

这是一种“我已经失去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对象。 我甚至得到了“已经创建了id%s的新标签”,在devserver的提示符下打印,并且每次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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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