django ModelMultipleChoiceField 设置初始值



我有以下代码:

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

如何在选择框中设置初始值,例如"选择类别",以便选择框应具有初始值为"选择类别"的类别列表

您可以从视图中传递"初始"设置。 例如:

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

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

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

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

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

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

我在管理员和模型表单中需要类似的东西,我只是做了这样的事情:

    def __init__(self, *args, **kwargs):
        super(CategoryAdminForm, self).__init__(*args, **kwargs)
        self.initial['category'] = list(Category.objects.filter(name=<whatever_you_need>))

它对我来说效果很好

最新更新