2017-08-17 55 views
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
:与values_list查询集( 'ID',平=真)
  • 溶液2放列表()

    或有人知道另一种解决方案?

    PS。是的,我知道,ModelMultipleChoiceField存在,但我有许多领域的上述逻辑,并不想现在重构所有代码。

  • 回答

    0
    class MyForm(forms.ModelForm): 
        city = City.objects.all() 
        cities = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, required=True, queryset=city) 
        class Meta: 
         model = Team 
         fields = ('city') 
    

    可能试试吗?

    +0

    这并不能解决问题。问题在于MultipleChoiceField的初始化。 QuerySet是其他可迭代结构(如generator或itertools.chain)的示例。 – warcholprzemo