加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django ModelChoiceField使用来自一个模型属性的不同值

发布时间:2020-12-20 11:19:25 所属栏目:Python 来源:网络整理
导读:所以我正在开发一个 django应用程序,我有一个模型事件.每个事件都有一些属性,比如其中一个是“hostname”(我将在整个过程中使用它作为例子).我需要实现搜索功能,用户可以在其中搜索具有hostname == some_value的所有事件,例如hostname ==“myhost.foo.bar”.
所以我正在开发一个 django应用程序,我有一个模型事件.每个事件都有一些属性,比如其中一个是“hostname”(我将在整个过程中使用它作为例子).我需要实现搜索功能,用户可以在其中搜索具有hostname == some_value的所有事件,例如hostname ==“myhost.foo.bar”.

现在,我想允许用户在搜索表单的组合框中选择有效选项(即一个或多个事件中实际存在的主机名),因此我将ModelChoiceField用于我的表单.我的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",required=False)

这是有效的,但这个列表只填充一次,因此它与数据库不是最新的.

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

此致
Hallgeir

解决方法

第二种方法可行,但您需要在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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读