将相关对象添加到内联

时间:2016-09-06 11:12:23

标签: django

我有一个OneToOneField和我的User和UserProfile模型。还有第二个模型交易。创建事务时,它将使用foreignKey User对象。

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

所以它看起来像这样:

enter image description here

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

userid_id  transaction_id
   2            1
   2            2
   4            3
   4            4

然后每当我从管理面板查看用户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)

在我的管理面板中

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)

1 个答案:

答案 0 :(得分:3)

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

使用第三方软件包

您可以在GitHub包页面上使用Django-super-inlines包,安装程序和示例。

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

为同一模型使用两个admin类并将其链接

我们可以定义从UserProfileTransaction的链接,而不是使用第三方软件包嵌套内联。

要实现这一目标,您需要制作两个adminUserProfile模型,以扩展基础ModelAdminTabularInline,并编写一个简单的自定义方法:< / p>

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)

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