如何解决如何从列表中提取JSON值并以Django模型形式呈现?
我正在尝试使用以下模型呈现Django模型表单。问题是模型字段之一是JSONField。这是长度为1的列表,其中包含一些JSON数据。呈现模型表单时,number
字段呈现列表,没有任何问题。但是我想从列表内的JSON中提取phone
值并进行渲染。我尝试将其提取到模板中,但无法正常工作。
如何从JSON中提取phone
值并将其呈现为表单?例如,当我使用视图呈现ID为1的数据时,我应该在名称字段中看到“ Client_1”,在数字字段中看到“ 1234567890”。
我正在使用Django 3.1和Django Crispy Forms来呈现模型表单。
作为db中可见的客户表的数据:
id name number
1 Client_1 [{'type': 'mobile','phone': '1234567890'}]
2 Client_2 [{'type': 'mobile','phone': '3334445555'}]
3 Client_3 [{'type': 'mobile','phone': '9876543210'}]
models.py:
class Client(models.Model):
name = models.TextField()
number = models.JSONField(blank=True,null=True)
forms.py:
from .models import Client
class ClientForm(forms.ModelForm):
class Meta:
model = Client
fields = '__all__'
clients.html模板:
{% load crispy_forms_tags %}
<form method="POST">
<div class="form-row">
<div class="form-group col-md-6">
{{ form.name | as_crispy_field }}
</div>
<div class="form-group col-md-6">
{% for item in form.number %}
{{ item.0.phone | as_crispy_field }}
{% endfor %}
</div>
</div>
</form>
views.py:
def clients(request,pk):
instance = Client.objects.get(pk=pk)
if request.method == 'POST':
form = ClientForm(request.POST,instance=instance)
if form.is_valid():
form.save()
else:
form = ClientForm(instance=instance)
return render(request,'clients.html',{'form': form})
解决方法
您需要在表单中动态添加字段,这是一个有效的示例:
"name":["0^John^1^1^1^test1","0^cena^0^5^1^"]
您的模板应为:
class ClientForm(forms.ModelForm):
def __init__(self,*args,instance=None,**kwargs):
super(ClientForm,self).__init__(*args,instance=instance,**kwargs)
if instance:
for index,obj in enumerate(instance.number):
self.fields[f'phone_{index}'] = forms.CharField(initial=obj.get('phone',''))
def save(self,commit=True):
for index,obj in enumerate(self.instance.number):
obj['phone'] = self.cleaned_data.get(f'phone_{index}','')
return super(ClientForm,self).save(commit=commit)
class Meta:
model = Client
fields = ['name']
NB :如果始终将手机存储在列表中,则应将默认设置为JsonField:
{% load crispy_forms_tags %}
<form method="POST">
<div class="form-row">
<div class="form-group col-md-6">
{{ form.name | as_crispy_field }}
</div>
<div class="form-group col-md-6">
{{ form.phone_0 | as_crispy_field }}
</div>
</div>
</form>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。