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)
为什么不用一个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您的表单.