2
在Django 1.9我可以初始化MultipleChoiceField與初始化MultipleChoiceField與查詢集
forms.py
class MyForm(forms.Form):
city = forms.MultipleChoiceField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['city'].choices = City.objects.values_list('id', 'name')
self.initial['city'] = \
City.objects.filter(some_flag=True).values_list('id', flat=True)
在Django 1.11這是行不通的,因爲我已經把元組或列表查詢集
self.initial['city'] = \
list(City.objects.filter(some_flag=True).values_list('id', flat=True))
我發現,django.forms.widgets有一個新類ChoiceWidget,方法format_value
def format_value(self, value):
"""Return selected values as a list."""
if not isinstance(value, (tuple, list)):
value = [value]
return [force_text(v) if v is not None else '' for v in value]
爲什麼?在我看來,檢查Iterable是更好的方法,
編輯:Iterable可以弄亂字符串。所以我們可以檢查值是否也是QuerySet。
def format_value(self, value):
"""Return selected values as a list."""
#from collections import Iterable
#if not isinstance(value, Iterable):
from django.db.models.query import QuerySet
if not isinstance(value, (tuple, list, QuerySet)):
value = [value]
return [force_text(v) if v is not None else '' for v in value]
所以
- 溶液1:猴修補的widget爲MultipleChoiceField
或有人知道另一種解決方案?
PS。是的,我知道,ModelMultipleChoiceField存在,但我有許多領域的上述邏輯,並不想現在重構所有代碼。
這並不能解決問題。問題在於MultipleChoiceField的初始化。 QuerySet是其他可迭代結構(如generator或itertools.chain)的示例。 – warcholprzemo