2017-04-21 2 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']}) 

나는 이것이 내가 올바른 HTML 출력을 얻을 manage.py 쉘을 사용하여 실행

인쇄 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

모델에서 반환 된 초기 데이터가 문자열 유형

등으로 인해 발생했습니다.

Django 1.4는 1.11에서 발생하지 않은 데이터를 내부적으로 목록으로 변환 할 수 있습니다. 변환 된 초기 데이터가 있습니다 (예 : == 'test': 초기 = { '테스트': u "[u'a ', u'k']"}) 목록에 올리면 이제는 잘 작동합니다. 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']) 
에서 대신 문자열 형식의 목록 유형으로 '테스트'필드 데이터를 렌더링

작업 조각