将相关对象添加到内联

van*_*lay 3 django

我有一个 OneToOneField 和我的 User 和 UserProfile 模型。和第二个模型交易。创建事务时,它需要一个外键用户对象。

我想要的是使用 OneToOneField UserProfile 来显示与该用户相关的事务对象。用交易对象的 str 表示。

所以它看起来像这样:

在此处输入图片说明

另一个例子是,假设我的数据库是

userid_id  transaction_id
   2            1
   2            2
   4            3
   4            4
Run Code Online (Sandbox Code Playgroud)

然后每当我从管理面板查看用户 2 时,我只会看到交易 1 和 2。

我不太清楚如何显示 onetomany 关系或一般指定在管理面板中显示哪些对象。

class transaction(models.Model):
    amount = models.IntegerField()
    investment_point = models.ForeignKey(investment_point, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ip = models.IntegerField(default=0)
    ingameName = models.CharField(max_length=50, default='NotSet')  

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)
Run Code Online (Sandbox Code Playgroud)

在我的管理面板中

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'profile'

class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

Dam*_*nic 5

默认情况下,Django Admin 不支持嵌套内联(据我了解,您需要嵌套内联)。但是,有几种解决方法。

使用第三方包

您可以简单地使用Django-super-inlines包,遵循包 GitHub 页面上的安装过程和示例。

此外,还有django-nested-admin可以帮助您。

admin对同一模型使用两个类并将它们链接起来

我们可以定义一个从UserProfile到的链接,而不是使用第三方包进行嵌套内联Transaction

为此,您需要创建两个模型adminUserProfile,扩展 baseModelAdminTabularInline,并编写一个简单的自定义方法:

from django.core.urlresolvers import reverse

# Main admin model
class UserProfileAdmin(admin.ModelAdmin):
    inlines = [TransactionInline, ]

# Register it as admin
admin.site.register(UserProfile, UserProfileAdmin)

# This will show a reference
class UserProfileReferenceInline(admin.TabularInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'profile'
    readonly_fields = ('reference_link', )

    def reference_link(self, instance):
        if instance.id:
            # Change 'yourapp' with your app name
            reference_url = reverse(
                'admin:yourapp_transaction_change', args=(instance.id,)
            )
            return '<a href="%s" target="_blank">Transaction</a>' % reference_url
        return ''

    reference_link.allow_tags = True

class UserAdmin(UserAdmin):
    inlines = (UserProfileReferenceInline, )

admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

这只是如何完成的一个示例,上面的代码可能需要进行一些调整才能适合您的项目。