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



我对Django很陌生,通过观看几个教程实现了一个后api调用,其中一个字段获得了一个字典列表,想要访问Django模板中的键值对,而不是逐个char,我是否必须更改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)

template.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

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

你可能应该把它改成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,所以应该是:message而不是Message


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

相关内容

  • 没有找到相关文章

最新更新