django admin inlines:从 formfield_for_foreignkey 获取对象

pythonDjango

1个回答

写回答

陆通

2025-06-19 04:10

+ 关注

Django
Django

使用 Django 开发网站时,经常需要使用 Django Admin 来管理后台数据。而 Django Admin 提供了一个非常方便的功能,即 Inline。Inline 允许我们在编辑一个模型时,同时编辑与之关联的其他模型。

Django Admin 中,我们可以通过 inlines 属性来定义 Inline 模型。但有时候我们可能需要根据某些条件来动态地生成 Inline 模型。这时,我们可以使用 formfield_for_foreignkey 方法来获取对象,并根据对象的属性来决定是否显示 Inline。

下面是一个简单的例子,演示了如何使用 formfield_for_foreignkey 方法获取对象。

首先,我们需要定义两个模型:AuthorBook。一个作者可以写多本书,因此 Book 模型中有一个外键指向 Author 模型。

Python

from Django.db import models

class Author(models.Model):

name = models.CharField(max_length=100)

def __str__(self):

return self.name

class Book(models.Model):

title = models.CharField(max_length=100)

author = models.ForeignKey(Author, on_delete=models.CASCADE)

def __str__(self):

return self.title

接下来,我们需要为 Author 模型定义一个 Inline 模型。我们希望在编辑作者时,可以同时编辑他所写的书籍。因此,我们需要定义一个 BookInline 模型。

Python

from Django.contrib import admin

class BookInline(admin.TabularInline):

model = Book

@admin.register(Author)

class AuthorAdmin(admin.ModelAdmin):

inlines = [BookInline]

这样,当我们在 Django Admin 中编辑作者时,就会同时显示他所写的书籍。但有时候我们可能只想显示某些满足条件的书籍。这时,我们可以使用 formfield_for_foreignkey 方法来过滤书籍。

BookInline 类中,我们可以重写 formfield_for_foreignkey 方法,来获取作者对象,并根据作者的属性来过滤书籍。

Python

class BookInline(admin.TabularInline):

model = Book

def formfield_for_foreignkey(self, db_field, request, <strong>kwargs):

if db_field.name == 'author':

# 获取当前编辑的作者对象

author = self.get_object(request, Author)

# 根据作者的属性来过滤书籍

kwargs['queryset'] = Book.objects.filter(author=author)

return super().formfield_for_foreignkey(db_field, request, </strong>kwargs)

在上面的代码中,我们首先通过 get_object 方法获取当前编辑的作者对象。然后,我们使用 filter 方法来过滤书籍,只显示与当前作者关联的书籍。

通过上述步骤,我们就可以根据 formfield_for_foreignkey 方法获取对象,并根据对象的属性来动态生成 Inline 模型。这样,我们就可以更加灵活地管理后台数据了。

示例代码如下:

Python

from Django.db import models

from Django.contrib import admin

class Author(models.Model):

name = models.CharField(max_length=100)

def __str__(self):

return self.name

class Book(models.Model):

title = models.CharField(max_length=100)

author = models.ForeignKey(Author, on_delete=models.CASCADE)

def __str__(self):

return self.title

class BookInline(admin.TabularInline):

model = Book

def formfield_for_foreignkey(self, db_field, request, <strong>kwargs):

if db_field.name == 'author':

# 获取当前编辑的作者对象

author = self.get_object(request, Author)

# 根据作者的属性来过滤书籍

kwargs['queryset'] = Book.objects.filter(author=author)

return super().formfield_for_foreignkey(db_field, request, </strong>kwargs)

@admin.register(Author)

class AuthorAdmin(admin.ModelAdmin):

inlines = [BookInline]

在上述代码中,我们定义了两个模型 AuthorBook,并为 Author 模型定义了一个 Inline 模型 BookInline。然后,我们在 AuthorAdmin 中注册了 Author 模型,并添加了 BookInline

这样,当我们在 Django Admin 中编辑作者时,就可以同时编辑他所写的书籍。并且,只会显示与当前作者关联的书籍。

通过上述例子,我们学习了如何使用 formfield_for_foreignkey 方法来获取对象,并根据对象的属性来动态生成 Inline 模型。这个方法在 Django Admin 中非常有用,可以帮助我们更加灵活地管理后台数据。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号