【问题标题】:django modelchoicefield with distinct column values具有不同列值的 django modelchoicefield
【发布时间】:2016-06-12 17:37:44
【问题描述】:

我想做的是用模型表中一列的不同值填充select 元素。

我的表单.py:

class ExampleForm(forms.ModelForm):
    only_unique_values = forms.ModelChoiceField(
        required = False,
        queryset = ReadOnlyTable.objects.values('pie').distinct(),
        widget = forms.Select
    )

使用values 函数返回ValuesQuerySet 而不是QuerySet,这对我的select 元素来说是个问题,因为所有选项都使用字典语法作为值填充,而不仅仅是列数据作为strings.

它最终看起来像这样

<select id="id_example" name="example_form">
<option value="" selected="selected">---------</option>
<option value="{'pie': u'apple     '}">{'pie': u'apple     '}</option>
<option value="{'pie': u'pecan     '}">{'pie': u'pecan     '}</option>
<option value="{'pie': u'dutch     '}">{'pie': u'dutch     '}</option>
<option value="{'pie': u'pumpkin     '}">{'pie': u'pumpkin     '}</option>
</select>

我希望它看起来像这样

<select id="id_example" name="example_form">
<option value="" selected="selected">---------</option>
<option value="apple">apple</option>
<option value="pecan">pecan</option>
<option value="dutch">dutch</option>
<option value="pumpkin">pumpkin</option>
</select>

如何从我的模型上的 distinct() 调用返回 string 值?

【问题讨论】:

  • 你在使用 postgresql 吗?如果是这样,您总是可以这样做 ...objects.all().distinct('pie')
  • @Obj3ctiv3_C_88 不,SQL Server。

标签: python django


【解决方案1】:

模型选择字段用于从模型中选择实例。如果您从模型实例中选择值,则模型选择字段不再适用。

您可以改用选择字段,并在表单的__init__ 方法中设置选择。

class ExampleForm(forms.ModelForm):
    only_unique_values = forms.ChoiceField(
        required=False,
        choices=[],
        widget=forms.Select,
    )

    def __init__(self, *args, **kwargs):
        super(ExampleForm, self).__init__(*args, **kwargs)
        self.fields['only_unique_values'].choices = ReadOnlyTable.objects.values_list('pie', 'pie').distinct()

执行values_list('pie', 'pie') 会为您提供选择字段所需的二元组列表。

在 Django 1.8+ 中,您不再需要覆盖 __init__。相反,您可以定义一个返回选项列表的可调用对象,并将可调用对象传递给您的选择字段。

def unique_values():
    return ReadOnlyTable.objects.values_list('pie', 'pie').distinct()

class ExampleForm(forms.ModelForm):
    only_unique_values = forms.ChoiceField(
        required=False,
        choices=unique_values,
        widget=forms.Select,
    )

要在您的选择字段中包含一个空白选项,只需在选择列表中添加一个项目:

def unique_values():
    return [("", "---------")] + list(ReadOnlyTable.objects.values_list('pie', 'pie').distinct())

【讨论】:

  • 你的意思是ChoiceField在这里?
  • 是的,它应该是一个选择字段。现已修复。
  • 这会杀死默认值选项吗?
  • 如果你想添加一个空选项,你可以做choices = [("", "---------")] + list(ReadOnlyTable.objects.values_list('pie', 'pie').distinct())
  • 您错过了list()(刷新页面以查看更新的评论)。
猜你喜欢
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2014-11-15
相关资源
最近更新 更多