Django 1.11 模板无法正确呈现与 Django 1.4 一起使用的 MultipleChoiceField

Django 1.11 Template not rendering MultipleChoiceField correctly which is working with django 1.4

我正在尝试将现有应用程序从 1.4 版升级到 1.11 版。 我遇到一个问题,即 MultipleChoiceField 被存储在数据库中,但模板不呈现那些被选中的内容。

models.py

class TestModel(models.Model):
    test = models.CharField(blank=True, max_length=200)

forms.py

from django import forms
from django.forms import ModelForm
from app.models import TestModel
CHOICES = (
    ('1', 'Select All'),
    ('a', 'choice 1'),
    ('k', 'choice 2'),
)
class TestForm(ModelForm):
    test = forms.MultipleChoiceField(choices=CHOICES, required=False, widget=forms.CheckboxSelectMultiple()
    )
    class Meta:
        model = TestModel
        fields = '__all__' 

form1 = TestForm(data={'test': ['a','k']})

当我 运行 使用 manage.py shell 时,我得到了正确的 HTML 输出

打印表格 1

<tr>
<th><label>Test:</label></th>
<td>
<ul id="id_test">
    <li>
    <label for="id_test_0"><input type="checkbox" name="test" value="1" id="id_test_0" onclick="selectAll(this);" />Select All</label>
    </li>
    <li>
    <label for="id_test_1"><input type="checkbox" name="test" value="a" checked id="id_test_1" onclick="selectAll(this);" />choice 1</label>
    </li>
    <li>
    <label for="id_test_2"><input type="checkbox" name="test" value="k" checked id="id_test_2" onclick="selectAll(this);" />choice 2</label>
    </li>
</ul>
</td>
</tr>   

在代码中可以看到它有checked属性

模板

<div id="Scrolldrive2">{{form1.test}}</div> 

选定的复选框未在 UI 上呈现。

问题是由于从模型返回的初始数据是字符串类型

例如。 form1 = TestForm(initial={'test': u[u'a', u'k']"})

Django 1.4 可以在内部将数据转换为列表,而 1.11.Have 将初始数据转换为列表,现在工作正常。

将 'test' 字段数据呈现为列表类型而不是 forms.py

中的字符串类型的工作代码段
import json
def jsonify(data):
    return json.loads(data.replace("u'", "'").replace("'", '"'))
    #output is [u'a', u'k']  


class TestForm(ModelForm):
    test = forms.MultipleChoiceField(choices=CHOICES, required=False, 
           widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = TestModel
        fields = '__all__' 
    def __init__(self, *args, **kwargs):
        super(TestForm, self).__init__(*args, **kwargs)
        if self.instance:
            obj_data = self.instance.__dict__ 
            self.initial['test'] = jsonify(obj_data['test'])