【问题标题】:why is django form.errors displayed as string?为什么 django form.errors 显示为字符串?
【发布时间】:2012-07-29 23:53:23
【问题描述】:

我正在使用 django 表单。我将表单错误传递给模板,

return render_to_response(template_name, {'form':form})

在模板中我需要将其转换为 js 字典,所以我使用了,

eval({{form.errors|safe}})

但是无论我在模板中使用 form.errors 的任何地方,我都会得到 html 格式而不是字典。为什么 django 表单显示为字符串而不是字典。有没有办法使用 form.errors 的字典版本。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    它显示为无序列表,因为 error collection's ErrorDict.__unicode__ 方法返回ErrorDict.as_ul的值。

    如果您想取回字典的默认字符串表示形式,请将其转换回字典:dict(form.errors)。现在您将不再获得 HTML 格式的无序列表。

    更新

    如果您尝试在 JS 中表示 Python 字典,请保持简单并将字典对象编码为 JSON。所以在你看来:

    from django.utils import simplejson
    
    errors = simplejson.dumps(form.errors)
    

    【讨论】:

    • 这种方法的问题是dict中的所有值都是unicode字符串,即它们都以u'string'为前缀。这会导致JS错误
    • 有没有办法将它们转换为字典中的字符串。现在我已经写了一个列表理解来做到这一点。
    • 对,在喝完早上的咖啡后,我更新了答案,说明如何为错误集合获取有效的 JS 表示。
    【解决方案2】:

    查看 django 的源代码,错误应该属于 django.forms.util.ErrorDict 类型。

    其中有以下两种可能对您的案例感兴趣的方法:as_text 和 as_ul。

    我不明白您如何在 django 模板中使用 eval 方法。据我所知,这甚至不是一个有效的标准 django 模板标签。

    我认为您应该手动循环 dict 并相应地打印/生成 javascript 对象文字。

    【讨论】:

    • 你误解了这个问题。 eval() 方法属于 JS,不是模板标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多