【问题标题】:Cannot create new Django model object within Ajax post request无法在 Ajax 发布请求中创建新的 Django 模型对象
【发布时间】:2011-04-02 00:45:43
【问题描述】:

这是一种“我已经失去了 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 都增加了一个,正如假设的那样,但对象并未存储在 db 中。

当我执行时

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

在 Django shell 中,新的 Tag 对象被定期创建,但从 jQuery 请求中,它没有被创建。

知道出了什么问题,要检查什么,如何调试......

后面的数据库是 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)

更新2

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

【问题讨论】:

    标签: javascript jquery python django orm


    【解决方案1】:

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

    【讨论】:

    • 会尝试的。这真的很奇怪,特别是因为 django 应用程序现在可以正常工作很长时间了。将编写单元测试。
    • 谜团加深!你能尝试一个实验吗?将createAjax 更改为处理直接POST 而不是AJAX 的普通方法。看看它是否有效(在开发和单元测试中)。还要查看调用视图后事务是否有回滚的可能性。
    • 非常感谢 Manoj。 UTest 成功后,我再次尝试了 Ajax 调用并添加了标签。我不喜欢这种事后综合症:(不过,我会尝试重现问题并找出问题所在......
    【解决方案2】:

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

    【讨论】:

    • 感谢您的信息。我正在使用事务中间件。另外,方法正在返回 HttpResponse,但我没有在此处包含代码(我应该写下整个方法)。
    【解决方案3】:

    试试

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

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

    【讨论】:

    • 感谢您的回答。我已经尝试过了,new_tag = Tag.objects.create(name=tagName) 但它不起作用:(我正在清理 tagName,但为了简单起见,这部分被省略了。
    • 你能把输出的sql抓到DB吗?
    • 怎么样?这是 ajax 请求,所以 djangologging 不会做这件事(据我所知)。我将尝试通过 PostgresSQL 记录所有内容
    • 对于 MySQL,我使用 MySQL 代理将 sql 发送到控制台。也许你有类似 Postgres 的工具?
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多