如何使用autocomplete_fields为外键添加自动完成功能

时间:2018-09-23 20:59:39

标签: django django-models

我有以下型号

from django.db import models

class Ipaddress(models.Model):
    ipaddress=models.CharField(max_length=20)
    slug = models.SlugField(unique=True)
    machinename=models.CharField(max_length=500)
    user=models.CharField(max_length=200)
    department= models.ForeignKey('Department',on_delete=models.CASCADE,default='Empty')
    location= models.ForeignKey('Location', on_delete=models.CASCADE)
    updated = models.DateField("Date Updated",null=True)
    note =models.TextField()

    def __str__(self):
        return self.ipaddress[:50]

在管理页面中:

from django.contrib import admin
from pages.models import Post, Device, DeviceType, DeviceModel, Ipaddress, DeviceGroup, Location,Department,Comment
from django_admin_listfilter_dropdown.filters import DropdownFilter, RelatedDropdownFilter


class IpaddressAdmin(admin.ModelAdmin):
        prepopulated_fields = {'slug': ('ipaddress',)}

    search_fields = ['ipaddress', ]

    list_display = ('ipaddress', 'machinename', 'user', 'department','location','updated',)
    list_filter = (
    ('user', DropdownFilter),
    ('department', RelatedDropdownFilter),
    ('location', RelatedDropdownFilter),

)

当我尝试添加设备时,它显示以下页面: 列表的位置可能是几千个机架。因此,我需要键入机架而不是滚动1000条记录。任何想法我怎么做。

1 个答案:

答案 0 :(得分:0)

在有人共享复杂的解决方案之前,我建议您将 ForeignKey 位置添加到search_fields中,例如:

search_fields = ['foreign_key__related_fieldname']

因此,如果您的“位置名称”是在您的位置模型中使用“标题”字段定义的,则可以这样做:

from django.contrib import admin
from .models import Ipaddress

class IpaddressAdmin(admin.ModelAdmin):
    search_fields = ['ipaddress', 'location__title']

admin.site.register(Ipaddress, IpaddressAdmin)

注意:在此示例中,将其简化为基本内容,假设该内容位于app / admin.py中,并且Ipadress模型位于app / models.py

这真的很方便,因为django admin分解了多个搜索词(由空格分隔),因此您可以搜索“ ip位置”,例如:

127.0.0.1瑞典

它将同时搜索您的“ ipadress”字段和外键“ Location”。

优点:

  • 快速!如果您需要在应用过滤器后进行搜索,则无需重新加载视图两次!
  • 简单

缺点:

  • 如果为search_fields添加许多外键或在外键模型中具有大量对象,查询可能会变慢。

Django 2.1文档:ModelAdmin.search_fields