On the Django admin site, can I access model properties through Inline?

models.py:

class Player(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField(max_length=50)

class Tournament(models.Model):
    name = models.CharField(max_length=50)

class TournamentPlayer(models.Model):
    tournament = models.ForeignKey(Tournament)
    player = models.ForeignKey(Player)
    paid = models.BooleanField()

    def player_email(self):
        return self.player.email

admin.py:

class TournamentPlayerInline(admin.TabularInline):
    model = TournamentPlayer
    fields = ('player', 'paid', 'player_email')

@admin.register(Tournament)
class TournamentAdmin(admin.ModelAdmin):
    inlines = [TournamentPlayerInline]

I have an Inline question. When I put up a tournament on the admin site, I see which players go, and if they pay. I would also like to display additional information contained in Player, such as an email address.

In TournamentPlayerInline, it seemed to me that I can leave with fields = ('player', 'paid', 'player_email'), but I get FieldError: Unknown fields (player_email) specified for TournamentPlayer .

I also tried fields = ('player', 'paid', 'player__email'), but I got FieldError: Unknown fields (player__email) specified for TournamentPlayer .

player_email fields readonly_fields, , .

, :

enter image description here

Player TournamentPlayerInline?

Django 1.8.4

+6
3

. , , admin.py, 'player_email' fields, readonly_fields. 'player_email' fields .

class TournamentPlayerInline(admin.TabularInline):
    model = TournamentPlayer
    fields = ('player', 'player_email', 'paid',)
    readonly_fields = ('player_email',)

@admin.register(Tournament)
class TournamentAdmin(admin.ModelAdmin):
    inlines = [TournamentPlayerInline]
+6

, player_email , readonly_fields:

class TournamentPlayerInline(admin.TabularInline):
    model = TournamentPlayer
    fields = ('player', 'paid')
    readonly_fields = ('player_email',)

@admin.register(Tournament)
class TournamentAdmin(admin.ModelAdmin):
    inlines = [TournamentPlayerInline]
0

, , admin - Inline mixin:

models.py

class Player(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField(max_length=50)

class Tournament(models.Model):
    name = models.CharField(max_length=50)

class TournamentPlayer(models.Model):
    tournament = models.ForeignKey(Tournament)
    player = models.ForeignKey(Player)
    paid = models.BooleanField()

admin.py

class PlayerEmailMixin(object):
    def player_email(self, obj):
        return obj.player.email

    player_email.short_description = "Player Email"

class TournamentPlayerInline(PlayerEmailMixin, admin.TabularInline):
    model = TournamentPlayer
    fields = ('player', 'player_email', 'paid', )
    readonly_fields = ('player_email',)

@admin.register(Tournament)
class TournamentAdmin(admin.ModelAdmin):
    inlines = [TournamentPlayerInline]

URI :

class PlayerEmailMixin(object):
    def player_email(self, obj):
        return '<a href="mailto:{0}"><strong>{0}</strong></a>'.format(obj.player.email)

    player_email.short_description = "Player Email"
    player_email.allow_tags = True

, Django 1.9.5

0

Source: https://habr.com/ru/post/1610443/


All Articles