【问题标题】:Django-filters: Displaying a list of choices for filtering a TextFieldDjango-filters:显示用于过滤 TextField 的选项列表
【发布时间】:2021-04-09 14:24:52
【问题描述】:

在我基于 django 的 Web 应用程序中,我有一个模型,它在 models.py 中定义如下:

class Machine(models.Model):
  ip_address = models.TextField(blank=False, unique=True)
  hostname = models.TextField(blank=False, unique=True)

在我的 filters.py 文件中,我想创建一个基于 ip_address 字段的过滤器,用户将从选项列表中选择 IP。 我定义如下:

class MachineFilter(django_filters.FilterSet):
    ip_address = ModelChoiceFilter(queryset=Machine.objects.all().values_list('ip_address', flat=True))    

class Meta:
    model = Machine
    fields = ['ip_address', 'hostname']

但是,在网络表单中选择所需的 IP 时,我收到以下错误:

IP 地址:选择一个有效的选项。这个选择不是其中之一 可用的选择。

我尝试从值列表定义中删除flat=True,但这仍然不起作用。

我做错了什么?

【问题讨论】:

    标签: django django-filter


    【解决方案1】:

    不是ModelChoiceFilter,而是ChoiceFieldModelChoiceFilter 表示您选择了一个型号,但在这里您选择了一个 IP 地址,因此您应该使用 ChoiceField

    class MachineFilter(django_filters.FilterSet):
        ip_address = ChoiceFilter(choices=[])
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.filters['ip_address'].extra['choices'] = [
                (ip, ip)
                for ip in Machine.objects.values_list('ip_address', flat=True)
            ]
    
        class Meta:
            model = Machine
            fields = ['ip_address', 'hostname']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多