Django SelectMultiple Widget的动态选择

phi*_*o20 4 forms django widget

我正在构建一个表单(不是modelForm),我想使用SelectMultiple Widget根据在表单初始化期间完成的查询来显示选项.

我可以想到一些方法来做到这一点,但我并不清楚正确的做法.我看到了不同的选择.

我得到了"选择",我应该在表单init中传递给窗口小部件,但我不确定我应该如何传递它们.

class NavigatorExportForm(forms.Form):

def __init__(self,user, app_id, *args,**kwargs):
    super (NavigatorExportForm,self ).__init__(*args,**kwargs) # populates the form
    language_choices = Navigator.admin_objects.get(id=app_id).languages.all().values_list('language', flat=True)

languages = forms.CharField(max_length=2, widget=forms.SelectMultiple(choices=???language_choices))
Run Code Online (Sandbox Code Playgroud)

Clé*_*ent 6

为什么不用一个ModelMultipleChoiceField呢?

你可以做到这一点:

class NavigatorExportForm(forms.Form):
    languages = forms.ModelMultipleChoiceField(queryset=Language.objects.all())

    def __init__(self, app_id, *args, **kwargs):
        super(NavigatorExportForm, self).__init__(*args, **kwargs)
        # Dynamically refine the queryset for the field
        self.fields['languages'].queryset = Navigator.admin_objects.get(id=app_id).languages.all()
Run Code Online (Sandbox Code Playgroud)

这样,您不仅可以限制窗口小部件上的可用选项,还可以限制字段(为您提供数据验证).

使用此方法,窗口小部件中显示的字符串将是对象__unicode__上方法的结果Language.如果它不是您想要的,您可以编写以下自定义字段,如ModelChoiceField参考文档中所述:

class LanguageMultipleChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.language_code # for example, depending on your model
Run Code Online (Sandbox Code Playgroud)

并使用此类而不是ModelMultipleChoiceField您的表单.