2017-08-17 60 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