这是一种“我已经失去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 :
嗯,今天早上,似乎一切正常,但代码没有改变。我根本不喜欢这样:(答案 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中取出它