我想有一个很好的自动完成程序在我的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'
)