我想有一个很好的自动完成程序在我的Django管理后台过滤出结果在project模型根据subject附加到person.这是我的models.py:

class Subject(models.Model):
    name = models.CharField(max_length=200)

class Person(models.Model):
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, blank=True, null=True)

class PersonRole(models.Model):
    project = models.ForeignKey('Project', on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)

class Project(models.Model):
    person = models.ManyToManyField(Person, through=PersonRole)

现在,我设法得到一个简单的列表使用SimpleListFilter和以下代码admin.py:

class PISubjectFilter(admin.SimpleListFilter):

   title = 'PI Subject'
   parameter_name = 'subject'

   def lookups(self, request, model_admin):
        return Subject.objects.values_list("id", "name").order_by("id")

   def queryset(self, request, queryset):
       count = range(1, 100)
       for x in count:
           if self.value() == str(x):
               return queryset.filter(
               person__personrole__person__subject=x
               ).distinct()
               break

如何将这个长长的列表变成一个自动完成的列表?

我已经almost通过为我的表单指定一个自定义模板来达到我想要的目的,如下所示:

{% load i18n %}
{% load static %}
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>

<details data-filter-title="{{ title }}" open>
  <summary>
    {% blocktranslate with filter_title=title %} By {{ filter_title }} {% endblocktranslate %}
  </summary>

  <select id='select_subject' onchange="location = this.value;">

  {% for choice in choices %}

  <option value="{{ choice.query_string|iriencode }}">{{choice.display}}</option>

  {% endfor %}

</select>

</details>
<script>
  $(document).subject').select2();
});
  </script>

这实际上创建了自动完成子目录,尽管在每个页面重新加载时,choice.selected保持不变,因此所选项目不会被更新.不管怎样,我相信有一种不那么笨重的方法来做这件事.

PS:不,就像

class SubjectFilter(AutocompleteFilter):
    title = 'Subject'
    field_name = 'person__personrole__person__subject'

不工作(Project has no field named 'person__personrole__person__subject')

推荐答案

您可以使用AutocompleteFilterFactory [GitHub],它"跟踪"字段,然后列出Subject并进行过滤,所以:

from admin_auto_filters.filters import AutocompleteFilterFactory

SubjectFilter = AutocompleteFilterFactory(
    'Subject', 'person__personrole__person__subject__name'
)

如果使用以下选项 Select 了项目,则可以筛选主要研究者:

class SubjectFilter(
    AutocompleteFilterFactory(
        'Subject', 'person__personrole__person__subject__name'
    )
):
    def queryset(self, request, queryset):
        if self.value():
            queryset = queryset.filter(
                person__person_role__contains='Principal investigator'
            )
        return super().queryset(request, queryset)

Python相关问答推荐

Odoo -无法比较使用@api.depends设置计算字段的日期

jit JAX函数中的迭代器

重新匹配{ }中包含的文本,其中文本可能包含{{var}

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

PywinAuto在Windows 11上引发了Memory错误,但在Windows 10上未引发

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

给定高度约束的旋转角解析求解

使用Python从URL下载Excel文件

使用BeautifulSoup抓取所有链接

剪切间隔以添加特定日期

如何在海上配对图中使某些标记周围的黑色边框

使用嵌套对象字段的Qdrant过滤

仅使用预先计算的排序获取排序元素

在第一次调用时使用不同行为的re. sub的最佳方式

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

设置索引值每隔17行左右更改的索引

如何在PYTHON中向单元测试S Side_Effect发送额外参数?

在聚合中使用python-polars时如何计算模式

为什么在不先将包作为模块导入的情况下相对导入不起作用