【问题标题】:Django ModelChoiceField using distinct values from one model attributeDjango ModelChoiceField 使用来自一个模型属性的不同值
【发布时间】:2011-10-06 04:26:02
【问题描述】:

所以我正在开发一个有模型事件的 django 应用程序。每个事件都有一些属性,比如说其中一个是“主机名”(我将在整个过程中使用它作为示例)。我需要实现搜索功能,用户可以搜索具有主机名 == some_value 的所有事件,例如主机名 == "myhost.foo.bar"。

现在,我想让用户在搜索表单的组合框中选择有效选项(即实际存在于一个或多个事件中的主机名),因此我将 ModelChoiceFields 用于我的表单。我的 ModelChoiceView 子类,用于显示正确的标签:

class HostnameModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
    return obj.host.hostname

我的表格:

class QueryForm(forms.Form):
    hostname = HostnameModelChoiceField(queryset=Event.objects.all(), required=False)
    ...

但是,这会产生重复,因为许多事件可能具有相同的主机名。我尝试在查询集上使用“distinct()”,但当然这不起作用,因为对象是不同的(即使显示的值不是)。

所以,我尝试只选择我需要的值:

class QueryForm(forms.Form):
    hostname = ModelChoiceField(queryset=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)

但这不会验证!我怀疑是因为这些值不是实际的 Event 实例,而只是字符串值。

所以我尝试了一个常规的 ChoiceField:

hostname = forms.ChoiceField(choices=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)

这可行,但此列表仅填充一次,因此它不是最新的数据库。

那么...有什么好的方法可以解决这个问题吗?概括一下这个问题:我如何使用来自模型的一个字段的不同值填充组合框,并使其与数据库保持同步?我认为 ModelChoiceField 将是最好的选择,如果我可以在使用 .values(...) 或 .values_list(...) 时对其进行验证。

真诚地, 哈尔盖尔

【问题讨论】:

    标签: django distinct choicefield


    【解决方案1】:

    第二种方式也可以,但您需要在 init 上设置选项,以便每次调用表单时都会刷新。

    例如

    class QueryForm(forms.Form):
        hostname = forms.ChoiceField(choices=[], required=False)
    
        def __init__(self, *args, **kwargs):
            super(QueryForm, self).__init__(*args, **kwargs)
            self.fields['hostname'].choices = Event.objects.all().values_list("hostname","hostname").distinct()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-16
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多