如何使用Django消息框架发送JSON或字典?

3
我正在使用Django消息框架来在验证错误时发送附加数据:
def clean_X(self):
        xuser_id = self.cleaned_data['xuser_id']
        if xuser.objects.filter(xuser_id=xuser_id).exists():
            available_now = {"available" : ["example","hello","ahc","sdcsd"]}
            messages.error(self.request, message = available_now,extra_tags="available_ids")
            raise forms.ValidationError('Sorry! User ID "%(xuser_id)s" is already taken, Please try another or chose one from following:', params={"xuser_id" : xuser_id})
        return xuser_id 

在模板中访问消息时,该消息会被转换为字符串,例如:
"{"available" : ["example","hello","ahc","sdcsd"]}"

让编程难以访问,即message.available

我如何使用Django-Messages直接向模板发送JSON。我的意图不仅是显示消息,而是使available-id可点击(就像Gmail自动建议用户名的那个)

谢谢!


我会编写一个自定义模板过滤器,将字符串转换为JSON并解析它。 - Selcuk
感谢Selcuk的回复。我尝试使用过滤器:ast.literal_eval(dictionary)将字符串转换回JSON,但它会抛出错误:malformed node or string:<django.contrib.messages.storage.base.Message object at 0x7f090a5d64e0>。 - Satish V Madala
2个回答

3
{% for message in messages %}
    <p>{{ message.tags }}</p>
    {% if message.tags == 'available_ids error' %}
    {% for obj,values in message.message.items %}
        <div>
            {{ obj  }} 
            {% for val in values %}
                <p class="user-id">{{ val }}</p>
            {% endfor %}
        </div>
    {% endfor %}
    {% endif %}
{% endfor %}

您可以在模板中使用上述代码片段使其正常工作,并根据您的要求进行修改。
它是如何工作的?
我们遍历每条消息,因为我们已经在消息中插入了字典,所以我们必须遍历字典,在字典内部有列表,所以我们也必须遍历它。 因此,我们必须使用三个for循环。您必须应用一些条件,例如何时需要迭代?您可以通过标签来检查。
在这里,我已经硬编码(迭代条件)以达到这个目的。
编辑:
使用两个for循环 使用以下行更新您的clean_X
available_now = ["example","hello","ahc","sdcsd"]
messages.error(self.request, message = available_now,extra_tags="available_ids")

并在模板中使用这些行

{% for message in messages %}
    <p>{{ message.tags }}</p>
    {% if message.tags == 'available_ids error' %}
        <div>
            {% for val in message.message %}
                <p class="user-id">{{ val }}</p>
            {% endfor %}
        </div>
    {% endif %}
{% endfor %}

谢谢!Sonu Kumar! 我只是想知道,这种问题处理的唯一方法是在模板上进行多次迭代吗? - Satish V Madala
我不知道。你可以使用两个for循环来实现相同的功能。请查看更新后的答案。 - sonus21

0

In views.py

def account_exists(request):

    error_message = {"for": "register", "type": "error", "msg": "Something wrong here, it may be that you already have an Account!"}
    messages.error(request, error_message)

    return redirect("register")

HTML

<div>
    {% for message in messages %}
    <script>
        message = "{{ message | safe}}"
        message = message.replace(/'/g, '"')
        console.log(message, typeof (message))
        json_message = JSON.parse(message)
        console.log(json_message, typeof (json_message))
        console.log(json_message.for)
        console.log(json_message.type)
        console.log(json_message.msg)
    </script>
    <br>
    {% endfor %}
</div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接