2016-09-06 5 views
2

私はUserとUserProfileモデルでOneToOneFieldを持っています。そして第2のモデル取引。トランザクションが作成されると、それはforeignKey Userオブジェクトを取ります。関連オブジェクトをインラインに追加

私はOneToOneField UserProfileを使用して、そのユーザーに関連するトランザクションオブジェクトを表示します。トランザクションオブジェクトのstr表現を使用します。

それはこのようになりますようにするには:別の例は、ある私のDBは

userid_id transaction_id 
    2   1 
    2   2 
    4   3 
    4   4 

私が管理パネルからユーザー2を見る時はいつでもその後、私は意志であると言うことができます

enter image description here

トランザクション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) 
+0

だから、Django管理者のUserProfileオブジェクトに関連するInline Transactionオブジェクト( '__str__'呼び出し)を出力したいのですか? – Nevertheless

+0

@KidBinary __str__呼び出しではありません。まあ、どうしたらいいか分からない。 __str__はオブジェクトを視覚的に表示するだけでした。私はトランザクションオブジェクトを表示したいだけです。 UserProfile – vandelay

+0

Allrightのユーザーに関連し、UserProfilesにバインドされたUserモデル、インラインUserProfiles、およびインライントランザクションのようにする必要がありますか? – Nevertheless

答えて

3

、Djangoの管理者は、ネストされたインラインをサポートしていない(と私は理解されるように、ネストされたインラインが必要です)。ただし、いくつかの回避策があります。

インストール手順とパッケージのGitHubページの例を次のサードパーティパッケージ

あなたは単にDjango-super-inlinesパッケージを使用することができますが、使用します。

また、django-nested-adminもあります。

同じモデルの2つのadminクラスを使用し、それらに

をリンクする代わりに、サードパーティ製のパッケージとネストされたインラインを作り、我々はUserProfileからTransactionへのリンクを定義することができます。

これを実現するために、あなたはベースModelAdminTabularInlineの両方を拡張し、簡単なカスタムメソッドを書くために、UserProfileモデルの2つのadminクラスを作成する必要があります。

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) 

これは、それができるかのほんの一例です上記のコードでは、プロジェクトに合わせていくつかの調整が必要になる場合があります。

関連する問題