如何在Django Admin中创建类似堆叠内联但不使用外键的功能?

0 投票
1 回答
630 浏览
提问于 2025-04-17 13:33
class Data(models.Model):
    user = models.ForeignKey(User, unique=True)
    name = models.CharField(null=False, max_length=250)


class OtherData(models.Model):
    user = models.ForeignKey(User, unique=True)
    something = models.CharField(max_length=250)

如何在Django的管理后台创建类似于堆叠内联的功能,但不使用外键?如果我在管理页面查看Data对象,我希望能看到同一个用户的OtherData对象。

1 个回答

0

如果你想在同一个表单上管理 Data 和 OtherData,步骤如下:

  1. 在后台使用用户模型(User model);
  2. 在 Data 和 OtherData 上添加两个堆叠内联(stack inlines);
  3. 排除用户的所有文件,或者只把用户名设置为只读,以便参考;
  4. 你可能需要先注销用户模型,然后再重新注册,因为据我所知,它只能注册一次。

这里有一段示例代码:

from django.contrib.admin import StackedInline
from django.contrib.auth.models import User
from models import Data, OtherData

class DataInline(StackedInline):
    model = Data
    #form = you can customize your form
    #max_number = define the number of inlines

class OtherDataInline(StackedInline):
    model = OtherData

class UserAdmin(admin.ModelAdmin):
    inlines = (DataInline, OtherDataInline,)
    fields = ('username',)
    readonly_fields = ('username',)

#the user can be regitered just once in the admin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

如果一个用户有多个 Data 或 OtherData,你可能想尝试使用表格内联(TabularInline)。换句话说,如果你的模型中有一对多的关系,使用内联的灵活性非常棒。

撰写回答