2017-04-21 116 views
1

我試圖將現有的應用程序從版本1.4升級到1.11。 我有一個問題,其中MultipleChoiceField獲取存儲在數據庫中,但模板不會呈現這些被檢查。Django 1.11模板無法正確呈現MultipleChoiceField,它與django 1.4配合使用

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殼我得到正確的HTML輸出運行

打印Form1中

<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上。

回答

0

問題歸因於從模型返回的初始數據是字符串類型

例如, form1 = TestForm(初始= {'test':u'[u'a',u'k']「})

Django 1.4可以將數據轉換爲內部列表,這不會與1.11發生。已轉換的初始數據列出,現在它工作正常。

工作片斷這使得「測試」字段數據作爲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']) 
列表類型,而不是串類型