这是一种“我已经在调试这个问题上损失了 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 的新标签”,并且每次 ID 都会增加 1,正如所料,但对象并未存储在数据库中。
当我执行时
new_tag = Tag()
new_tag.name = tagName
new_tag.save()
从 Django shell 中,会定期创建新的 Tag 对象,但从 jQuery 请求中,不会创建它。
知道出了什么问题、要检查什么、如何调试......
后面的DB是PostgresQL 8.3。
任何建议都非常受欢迎:)
Update:
我写了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:
嗯,今天早上,似乎一切正常,但代码没有改变。我一点也不喜欢这个:(