所以我正在开发一个 Django 应用程序,其中有一个模型事件。每个事件都有一些属性,其中之一是“主机名”(我将在整个过程中使用它作为示例)。我需要实现搜索功能,用户可以搜索具有主机名 == some_value 的所有事件,例如主机名==“myhost.foo.bar”。
现在,我希望允许用户在搜索表单的组合框中选择有效选项(即一个或多个事件中实际存在的主机名),因此我在表单中使用 ModelChoiceFields。我的 ModelChoiceView 子类,用于显示正确的标签:
class HostnameModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return obj.host.hostname
My form:
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)
但这不会验证!我怀疑是因为这些值不是实际的事件实例,而只是字符串值。
所以我尝试了常规的 ChoiceField:
hostname = forms.ChoiceField(choices=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)
这是可行的,但是这个列表只填充一次,所以它不是数据库的最新内容。
那么...有什么好的方法可以解决这个问题吗?回顾一下这个问题:如何使用模型字段之一的不同值填充组合框,并使其与数据库保持同步?我认为 ModelChoiceField 将是最好的选择,如果我可以在使用 .values(...) 或 .values_list(...) 时对其进行验证。
真挚地,
哈尔盖尔