Django ModelChoiceField 使用来自一个模型属性的不同值
所以我正在开发一个 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)
但这不会验证!我怀疑是因为这些值不是实际的事件实例,而只是字符串值。
所以我尝试了常规的 ChoiceField:
hostname = forms.ChoiceField(choices=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)
这有效,但是此列表仅填充一次,因此它与数据库不同步。
那么...有什么好的方法可以解决这个问题吗?回顾一下这个问题:如何使用模型字段之一的不同值填充组合框,并使其与数据库保持同步?我认为 ModelChoiceField 将是最好的选择,如果我可以在使用 .values(...) 或 .values_list(...) 时验证它。
真挚地, 哈尔盖尔
so I'm working on a django application where I have a model Event. Each Event has some attributes, say one of them is "hostname" (which I will use throughout as an example). I need to implement search functionality where a user can search for all events that has hostname == some_value, e.g. hostname == "myhost.foo.bar".
Now, I wanted to allow the user to select among the valid options (i.e. the hostnames that actually exist in one or more event) in a combobox in the search form, so I use ModelChoiceFields for my form. My subclass of ModelChoiceView, for displaying the correct label:
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)
...
However, this gives duplicates because many events may have the same hostname. I attempted using "distinct()" on the queryset but of course that won't work because the objects are distinct (even if the displayed values are not).
So, I tried to instead select only the values I need:
class QueryForm(forms.Form):
hostname = ModelChoiceField(queryset=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)
But this won't validate! I suspect because the values are not actual Event instances but just string values.
So I tried a regular ChoiceField:
hostname = forms.ChoiceField(choices=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)
This works, BUT this list is only populated once, so it's not up to date with the database.
So... Is there any good way of solving this problem? To recap the question: HOW do I populate a combo box with the distinct values from one of the fields of a model, and also keeping it in-sync with the database? I would think that a ModelChoiceField would be the best bet, if I can get it to validate when using .values(...) or .values_list(...).
Sincerely,
Hallgeir
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
第二种方法可行,但您需要在 init 上设置选项,以便每次调用表单时都会刷新它。
例如
The second way will work, but you need to set the choices on init so its refreshed each time the form is called.
e.g