Django管理后台搜索和编辑外键字段

1 投票
1 回答
2557 浏览
提问于 2025-04-18 18:09

我有一个关于Django Admin的两个问题。

首先,我有一个Django模型叫做Classified,它有一个外键字段指向另一个表Address。在设置数据时,我对任何字段都没有问题,所有字段都能正确保存。

但是,如果我想编辑Classified中的外键字段,弹出的窗口里并不会显示旧的数据,而是显示空白的字段。

我该怎么做才能在点击+时让字段显示已有的数据,这样我才能编辑正确的信息呢?

其次,我记得在Django Admin里见过搜索字段。我记错了吗?有没有办法让我在管理面板中实现搜索功能?我有超过200万条记录需要不时更新或删除。手动翻遍所有页面去删除或编辑这些记录实在是太麻烦了。

添加模型代码:

Classified

class Classified(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    contact_person = models.CharField(max_length=300, blank=True)
    email = models.CharField(max_length=100, blank=True)
    address = models.ForeignKey(Address)
    subcategory = models.ForeignKey(Subcategory)

Address

class Address(models.Model):
    id = models.AutoField(primary_key=True)
    build_add = models.CharField(max_length=255)
    street_add = models.CharField(max_length=255)
    area = models.CharField(max_length=255)
    city = models.ForeignKey(Cities)

1 个回答

2

这里的 + 就是说,添加一个新的相关对象,并把你正在编辑的对象和这个新对象关联起来。因为你是添加一个新对象,所以一开始它是空的。如果你想在另一个对象的管理界面中编辑已经存在的相关对象,你需要使用 内联模型

在你应用的 admin.py 文件中,可以写成这样:

from django.contrib import admin
from yourapp.models import Address, Classified


class AddressInline(admin.TabularInline):
    model = Address


class ClassifiedAdmin(admin.ModelAdmin):
    inlines = [AddressInline,]


admin.site.register(Classified, ClassifiedAdmin)

从这里添加搜索功能非常简单。

...
class ClassifiedAdmin(admin.ModelAdmin):
    inlines = [AddressInline,]
    search_fields = [
        'field_you_want_to_search',
        'another_field',
        'address__field_on_relation',
    ]
...

注意最后一个例子中的双下划线。这意味着你可以根据相关对象字段中的值进行搜索。

补充说明:这个回答是对的,你的外键关系设置反了,按照你问题中展示的模型,Classified 应该是内联模型,而 Address 是主模型。

撰写回答