django ModelMultipleChoiceField设置初始值

时间:2014-11-17 06:07:31

标签: django django-forms multiplechoicefield

我有以下代码:

category = forms.ModelMultipleChoiceField(
    label="Category",
    queryset=Category.objects.order_by('name'),
    widget=forms.Select(
        attrs={
            'placeholder': 'Product Category', 'class': 'form-control'}),
    required=True
)

如何在选择框中设置初始值,例如“选择一个类别”,以便选择框应该有一个类别列表,其初始值为“选择一个类别”

3 个答案:

答案 0 :(得分:12)

你可以传递"首字母"从您的视图设置。例如:

form = FormUsingCategory(initial={'category':querysetofinitialvalues})

棘手的部分是你必须拥有正确的查询集。就像种子值一样,它必须是Category.objects.filter(...) - 其他任何东西都不会起作用。

答案 1 :(得分:10)

在创建表单实例时设置初始值或在表单中设置字段initial init

def __init__(self, *args, **kwargs):
    super(YourForm, self).__init__(*args, **kwargs)
    self.fields["category"].initial = (
        Category.objects.all().values_list(
            'id', flat=True
        )
    )

如果您只想在未选择任何字段时更改文本,则可以设置empty_label属性。 https://docs.djangoproject.com/en/1.10/ref/forms/fields/#django.forms.ModelChoiceField.empty_label

答案 2 :(得分:3)

如果您将QuerySet对象作为初始值并且widget=forms.CheckboxSelectMultiple传递,则不会选中复选框。我必须将QuerySet对象转换为列表,然后选中复选框:

YourForm(initial={'multi_field':
    [cat for cat in Category.objects.all().values_list('id', flat=True)]
    })