Django admin:如何在另一个间接相关的模型中显示内联模型

0 投票
1 回答
37 浏览
提问于 2025-04-14 16:10

我有几个模型,分别叫做用户(user)、认证令牌(authtoken)和用户设备(userdevice)。

class User(LifecycleModelMixin, AbstractUser):
    email = models.EmailField(unique=True)
    slug = models.SlugField(max_length=100, unique=True, blank=False, null=True)



 class AuthToken(models.Model):
        objects = AuthTokenManager()
        digest = models.CharField(
            max_length=CONSTANTS.DIGEST_LENGTH, primary_key=True)
        token_key = models.CharField(
            max_length=CONSTANTS.TOKEN_KEY_LENGTH, db_index=True)
        user = models.ForeignKey(User, null=False, blank=False,
                                 related_name='auth_token_set', on_delete=models.CASCADE)
        created = models.DateTimeField(auto_now_add=True)
        expiry = models.DateTimeField(null=True, blank=True)

class UserDevice(models.Model):
    token = models.OneToOneField(AuthToken, on_delete=models.CASCADE, related_name="auth_token")
    device_type = models.CharField(max_length=100, choices=DevicesChoices.choices)
    access_type = models.CharField(max_length=100, choices=AccessChoices.choices)
    device_brand = models.CharField(max_length=100, null=True, blank=True)

我想在管理面板的用户详情页面里,把用户设备的信息显示出来,并且希望是直接显示在同一行。

但是出现了一个错误:Django错误 admin.E202,提示'userdevice'没有指向'accounts.user'的外键。

我遇到了这个错误。任何帮助都非常感谢。

1 个回答

0

你需要把用户模型(User model)和用户设备模型(UserDevice model)连接起来。

在models.py文件中,你会进行相关的设置。

class UserDevice(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   token = models.OneToOneField(AuthToken, on_delete=models.CASCADE, related_name="auth_token")
   device_type = models.CharField(max_length=100, choices=DevicesChoices.choices)
   access_type = models.CharField(max_length=100, choices=AccessChoices.choices)
   device_brand = models.CharField(max_length=100, null=True, blank=True

在admin.py文件中,你也需要做一些配置。

from django.contrib import admin

class UserDeviceInline(admin.TabularInline):
   model = UserDevice
   extra = 0

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
   list_display = ['email', 'slug']
   inlines = [UserDeviceInline]

现在在用户详情中,你可以看到设备的信息了。了解更多信息

撰写回答