Django / Python:在模板中使用json.loads

时间:2021-12-19 06:04:15

I am trying to use json.loads in my template in order to get a python's dictionnary. But unfortunately, i encounter the same error :

我试图在我的模板中使用json.loads以获得python的词典。但不幸的是,我遇到了同样的错误:

Could not parse the remainder: ' = json.loads(entry.saved_data)' from 'everyEntry = json.loads(entry.saved_data)'

Here is my code from the template :

这是我的模板代码:

 <tbody>
                <tr> 
                  {% for entry in entries %}

                {{everyEntry = json.loads(entry.saved_data)}}
                {{ everyEntry.items}}

                {% for clef, valeura in headersLoop %}
                {% for chiave, valore in everyEntry %}
                {% if clef = chiave %}
                <td>
                  <p>{{clef}} {{valore}}</p>
                </td>
                {% endif %}
                {% endfor %}
                {% endfor %}
                {% endfor %}    
                </tbody>  

An at this line :

在这一行:

 {{everyEntry = json.loads(entry.saved_data)}}

the problem occurs.

问题出现了。

How may i fix this ?

我怎么能解决这个问题?

Thank you guys.

感谢你们。

4 个解决方案

#1


2  

Do not write logic in templates.

不要在模板中编写逻辑。

Do json.load in view and pass it to template via context.

在视图中执行json.load并通过上下文将其传递给模板。

#2


2  

Method 1 - Define custom model method

方法1 - 定义自定义模型方法

Create custom method in models.py,

在models.py中创建自定义方法,

class YourModel(models.Model):
   # your stuff

   def entry_saved_data(self):
      return json.loads(self.saved_data)

Method 2 - Using template tags

方法2 - 使用模板标签

You can use template tags for doing so.If you are now aware of template tags you can find it in docs

您可以使用模板标记来执行此操作。如果您现在知道模板标记,则可以在文档中找到它

@register.simple_tag
def entry_saved_data(value):
   return json.loads(value)

Use it in template like,

在模板中使用它,

{% load tags %}
{% entry_saved_data entry.saved_data as everyEntry %} 

you now have json deserialized data in everyEntry variable.

你现在在everyEntry变量中有json反序列化数据。

#3


0  

see: (functions in django templates)

看:( django模板中的函数)

Templates in django do not permit calls to arbitrary functions, that that is by design to the best of my knowledge.

django中的模板不允许调用任意函数,这是我所知道的设计。

That being said, you may be able to create a custom template tag that does what you want.

话虽这么说,您可以创建一个自定义模板标签,做你想要的。

https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

#4


0  

Thanks to bruno and Aniket, i found the solution.

感谢bruno和Aniket,我找到了解决方案。

First i created a method that returns a dict items such as bruno example :

首先,我创建了一个返回dict项的方法,例如bruno示例:

class YourModel(models.Model):   

`def entry_saved_data(self):

return json.loads(self.saved_data)

Then i made this loop into my template.html :

然后我把这个循环变成了我的template.html:

  <tr>
                {%for entry in entries%}
                {%for cle, valeur in entry.all_form_entry_json%}
                {%for key, valor in headersLoop%}
                {%if key == cle%}


                 <td> {{valeur}}</td>

                {% endif %}
                {% endfor %}
                {% endfor %}                   
                {% endfor %}                    
                </tr>

It prints all the datas. But one small problem appears. It doesn't fill the array in a proper way. Nevertheless all the datas from all the forms are printed.

它打印所有数据。但是出现了一个小问题。它没有以适当的方式填充阵列。然而,所有形式的所有数据都被打印出来。

:)

#1


2  

Do not write logic in templates.

不要在模板中编写逻辑。

Do json.load in view and pass it to template via context.

在视图中执行json.load并通过上下文将其传递给模板。

#2


2  

Method 1 - Define custom model method

方法1 - 定义自定义模型方法

Create custom method in models.py,

在models.py中创建自定义方法,

class YourModel(models.Model):
   # your stuff

   def entry_saved_data(self):
      return json.loads(self.saved_data)

Method 2 - Using template tags

方法2 - 使用模板标签

You can use template tags for doing so.If you are now aware of template tags you can find it in docs

您可以使用模板标记来执行此操作。如果您现在知道模板标记,则可以在文档中找到它

@register.simple_tag
def entry_saved_data(value):
   return json.loads(value)

Use it in template like,

在模板中使用它,

{% load tags %}
{% entry_saved_data entry.saved_data as everyEntry %} 

you now have json deserialized data in everyEntry variable.

你现在在everyEntry变量中有json反序列化数据。

#3


0  

see: (functions in django templates)

看:( django模板中的函数)

Templates in django do not permit calls to arbitrary functions, that that is by design to the best of my knowledge.

django中的模板不允许调用任意函数,这是我所知道的设计。

That being said, you may be able to create a custom template tag that does what you want.

话虽这么说,您可以创建一个自定义模板标签,做你想要的。

https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

#4


0  

Thanks to bruno and Aniket, i found the solution.

感谢bruno和Aniket,我找到了解决方案。

First i created a method that returns a dict items such as bruno example :

首先,我创建了一个返回dict项的方法,例如bruno示例:

class YourModel(models.Model):   

`def entry_saved_data(self):

return json.loads(self.saved_data)

Then i made this loop into my template.html :

然后我把这个循环变成了我的template.html:

  <tr>
                {%for entry in entries%}
                {%for cle, valeur in entry.all_form_entry_json%}
                {%for key, valor in headersLoop%}
                {%if key == cle%}


                 <td> {{valeur}}</td>

                {% endif %}
                {% endfor %}
                {% endfor %}                   
                {% endfor %}                    
                </tr>

It prints all the datas. But one small problem appears. It doesn't fill the array in a proper way. Nevertheless all the datas from all the forms are printed.

它打印所有数据。但是出现了一个小问题。它没有以适当的方式填充阵列。然而,所有形式的所有数据都被打印出来。

:)