如何在 Django 模板中访问字典列表

Posted

技术标签:

【中文标题】如何在 Django 模板中访问字典列表【英文标题】:How to access list of dictionary in Django template 【发布时间】:2021-10-17 16:48:43 【问题描述】:

我对 Django 很陌生,通过观看几个教程实现了一个 post-api 调用,其中一个字段获取字典列表,想要访问 Django 模板中的键值对,而不是逐个字符,我是否必须更改models.py中Message字段的定义或使用views.py中的JSON parser?如何解决这个问题?

models.py

class Leads(models.Model):
    Name = models.CharField(max_length=50)
    Mobile = models.CharField(max_length=13)
    Email = models.CharField(max_length=50)
    Message = models.CharField(max_length=300)
    created_on = models.DateTimeField(default=datetime.now())
    modified_on = models.DateTimeField(default=datetime.now())

上述 api 调用的示例输入为:

   Name = rakesh
   Mobile = 1234567890
   Email = email@mail.com
   Message = ['key': 'some text', 'value': 'some value', 'key': 'some text', 'value': 'some value']

这就是我的 api 记录存储在数据库中的方式

views.py

@api_view(["POST"])
def userLeads(request):
    try:
        if request.method == 'POST':
            Name = request.data['Name']
            Email = request.data['Email']
            Mobile = request.data['Mobile']
            Message = request.data['Message']   

            datainsertion = models.Leads(Name = Name, Email = Email, Mobile = Mobile,Message= Message)
            datainsertion.save()
            content = 'Leads_Status': 'Created'
            return Response(content, status=status.HTTP_200_OK)
    except Exception as e:
        print (e)
        content = 'Order_Status': 'Failed'
        return Response(content, status=status.HTTP_424_FAILED_DEPENDENCY)

Views.py

def chat_Leads_view(request):

    user_list = models.Leads.objects.all().order_by('-id')
    myFilter = UserFilter(request.GET, queryset=user_list)
    user_list = myFilter.qs
           
    page = request.GET.get('page', 1)
    paginator = Paginator(user_list, 5)
    
    try:
        users = paginator.page(page)
        
    except PageNotAnInteger:
        users = paginator.page(1)
        
    except EmptyPage:
        users = paginator.page(paginator.num_pages)
    
    segment = 'leads'
    context = 
        "users": users,
        "segment":segment,
        "myFilter":myFilter
        
       
    
    return render(request, "leads.html", context)

模板.html

   %for user in users %
     <tr>                                                
         <td>user.Name</td>
         <td>user.Mobile</td>
         <td>user.Email</td>
         <td>user.Message</td>
     </tr>
   %endfor%

如果我像上面那样尝试,那么输出是

rakesh  1234567890  emaik@mail.com  ['key': 'some text', 'value': 'some value', 'key': 'some text', 'value': 'some value']

如果我为Message 字段添加另一个循环,那么Message 字段不会显示任何输出:

   %for user in users %
     <tr>                                                
         <td>user.Name</td>
         <td>user.Mobile</td>
         <td>user.Email</td>
   %for i in user.Message %
         <td>i.key</td>
         <td>i.value</td>
   %endfor%
     </tr>
   %endfor%

输出: 逐个字符串显示

rakesh  1234567890  emaik@mail.com  

如果我这样尝试,那么:

%for user in users %
         <tr>                                                
             <td>user.Name</td>
             <td>user.Mobile</td>
             <td>user.Email</td>
       %for i in user.Message %
             <td>i</td>
       %endfor%
         </tr>
       %endfor%

输出:

rakesh  1234567890  emaik@mail.com  [  ' k e y ' : ' s o m e t e x t ' , ' v a l u e ' : 's o m e v a l u e ' ,  ' k e y ' :  ' s o m e t e x t ' , ' v a l u e ' : ' s o m e v a l u e '  ]

我在 Django 模板中想要的方式是:

rakesh  1234567890  emaik@mail.com  key:value 
                                    key: value

【问题讨论】:

您的消息是一个字符串,因为它来自 CharField,而不是列表、字典等。 是的,知道如何在 models.py 中更改它吗? 使用JsonField 【参考方案1】:

您的消息不是字典列表。它只是一个包含一些看起来像字典列表的数据的字符串。

您可能应该将其更改为JsonField [Django-doc]:

class Leads(models.Model):
    Name = models.CharField(max_length=50)
    Mobile = models.CharField(max_length=13)
    Email = models.CharField(max_length=50)
    Message = models.JSONField()
    created_on = models.DateTimeField(auto_now_add=True)
    modified_on = models.DateTimeField(auto_now=True)

并用数据重新填充数据库。在这种情况下,访问消息确实会返回一个字典列表,然后您可以使用该列表进行渲染:

<td>
% for item in user.Message %
     item.key <br>
     item.value 
% endfor %
</td>

注意:通常 Django 模型被赋予一个单数名称,所以Lead而不是Leads


注意:通常Django模型中的字段名是用snake_case写的,而不是PascalCase,所以应该是:@ 987654329@ 而不是 Message


注意:Django 的DateTimeField [Django-doc] 有一个auto_now_add=… parameter [Django-doc] 使用时间戳。这将自动分配当前日期时间 创建对象时,将其标记为不可编辑(editable=False),例如 默认情况下它不会出现在ModelForms 中。

【讨论】:

我收到以下错误:message = models.JsonField() AttributeError: module 'django.db.models' has no attribute 'JsonField' @Bharath:你用的是什么版本的 Django? @Bharath:这是一个错字:它是 JSONField 而不是 JsonField 我正在使用 Django=3.2.4 并且仍然得到相同的结果。如果您观察到我也有值作为键(我拥有的键是键和值)并且实际值是一些文本) @Bharath:type(request.data['Message']) 到底是什么?什么时候输入数据?

以上是关于如何在 Django 模板中访问字典列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中迭代字典的列表值

如何在 django 模板中访问字典值

如何访问 Django 模板中的字典元素?

如何访问 Django 模板中的字典元素?

如何在 django 中声明一个数据库驱动的字典,该字典可在模板中全局访问,而不依赖于 views.py

Django模板:如何通过每个字典的嵌套属性重新组合字典列表?