2017-01-06 24 views
0

ゲームエンティティがあり、それぞれに1つ以上のプラットフォームがあります。また、各ゲームは、関連するゲームへのリンクを1つ以上持つことができます(独自のプラットフォームを使用)。私はfilter_horizo​​ntal =( "related_gamesを拡張する必要がありDjangoの多対多フィールドの関連オブジェクトをカスタマイズします

@admin.register(Game) 
class GameAdmin(AdminImageMixin, reversion.VersionAdmin): 
    list_display = ("created", "name", "get_platforms"...) 
    list_filter = ("platforms", "year",) 
    #I'm interested in changing the field below 
    filter_horizontal = ("related_games",) 

    formfield_overrides = { 
     models.ManyToManyField: {"widget": CheckboxSelectMultiple}, 
    } 

    def get_platforms(self, obj): 
     return ", ".join([p.name for p in obj.platforms.all()]) 

admin.pyにこのコードを提供しています

class Game(TimeStampedModel): 
    gid = models.CharField(max_length=38, blank=True, null=True) 
    name = models.CharField(max_length=512) 
    platforms = models.ManyToManyField(
     Platform, blank=True, null=True) 
    ... 
    #here is the self-referencing m2m field 
    related_games = models.ManyToManyField(
     "self", related_name="related", blank=True) 

そして、このモデル:ここでは、models.pyでのように見えます"、) admin.pyの一部 - 関連ゲームウィジェットの各ゲームのプラットフォーム情報を追加します。 「(PS4、PSP、PS3)」のように表示されます(ゲーム名とプラットフォームのリスト)。

アプリケーションは、Djangoの1.7とPython 2.7

を使用するには、ご清聴ありがとうございました。 filter_horizontalの各項目に記載されたものをデフォルトで

答えて

1

は、オブジェクトの__str__または__unicode__法に基づいているので、あなたのような何かを試すことができ、次の

class Game(TimeStampedModel): 
    # field definitions 
    # ... 
    def __unicode__(self): 
     return '{0} ({1})'.format(
      self.name, 
      (', '.join(self.platforms.all()) if self.platforms.exists() 
       else 'none') 
     ) 

これで各ゲームショーを行いますプラットホームがない場合は、「クラッシュバンディクート(PS1、PS2)」や「戦場(なし)」などの名前(プラットフォーム)を「名前(プラットフォーム)」としてください。

また、モデルの__unicode__メソッドを変更したい場合は、を設定する必要があります10を使用してModelFormを使用し、related_gamesフィールドにはのカスタムFilteredSelectMultipleウィジェットがあり、render_optionsメソッドをオーバーライドする必要があります。次のクラスは、別々のファイルに入れる必要があります:

+0

そして、このような機能が管理者だけに必要で、水平フィルタウィジェットにしか関係ない場合はどうなりますか?私はこのプロジェクトが初めてで、__unicode__の部分を変更するといくつかの問題が壊れる可能性があるとします。 –

+0

確かに簡潔ではないが、__unicode__をオーバーライドする代わりに代替案を含める答えを編集した。 – ProfSmiles

+0

__unicode__の最初の変種はうまく動作する。 joinメソッドの必要な文字列を除いて、オブジェクトを除く。だから私はこれをこうしました: '' .join([self.platforms.all()のpのためのunicode(p)]) –

関連する問題