【问题标题】:django ModelMultipleChoiceField set initial valuesdjango ModelMultipleChoiceField 设置初始值
【发布时间】:2015-01-14 00:01:36
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

标签: django django-forms multiplechoicefield


【解决方案1】:

您可以将视图中的“初始”设置传递给它。例如:

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

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

【讨论】:

  • 这是我能在网上找到的唯一真正有效的东西。 +1
  • 感谢您提供有关获取正确查询集的提示...我一直试图通过覆盖 get_initial() 来预填充 modelmultiplechoicefield,但这些值从未出现,因为提供的查询集用于错误的模型。跨度>
【解决方案2】:

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

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

【讨论】:

  • 这是很多人需要的答案。谢谢!\
  • 这对我有用,但你能解释一下(或提供文档参考)这个东西是如何工作的吗? cat for cat in objects 这里执行的循环是什么
【解决方案3】:

在创建表单实例时设置初始值或在表单中设置字段初始值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

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多