Home > Blockchain >  How could I display parent object attribute in Django Admin?
How could I display parent object attribute in Django Admin?

Time:11-30

At the moment I'm working on an e-commerce application.

It contains a sub-app called "blog". The idea is that the superuser creates an account for the *Trainer. And yeah, I already created a new AbstractUser

Trainer logins into his account and creates Post I logged in here using my Trainer`s credentials

After I want the superuser to see WHO created post, but DjangoAdmin displays me admin`s email

How could I display the email of the 'creator' of the post in Django admin?

Code:

#models.py
class UserTrainer(AbstractUser):
    email = models.EmailField(verbose_name='email', max_length=100, unique=True)
    age = models.PositiveIntegerField(null=True)
    info = RichTextField(blank=True, null=True)
    image = models.ImageField(upload_to='media/stuff_images')
    inst = models.URLField(blank=True)
    REQUIRED_FIELDS = ['email', ]

def __str__(self):
    return self.email

def get_email(self):
    return self.object.email

class Post(models.Model): DEFAULT_TRAINER_ID = 1

article = models.CharField(max_length=50, default='Article text')
slug = models.SlugField(max_length=30)
keywords = models.CharField(max_length=100)
text = RichTextField(blank=True, null=True)
trainer = models.ForeignKey(UserTrainer, on_delete=models.CASCADE, null=False, default=1)

def __str__(self):
    return self.article

class Meta:
    verbose_name = 'Post'
    verbose_name_plural = 'Posts'

#admin.py
class CustomUserAdmin(UserAdmin):
    model = UserTrainer
    add_form = CustomUserCreationForm
    fieldsets = (
        *UserAdmin.fieldsets,
        (
            'TrainerInfo',
            {
                'fields': (
                    'age', 'info', 'image', 'inst',
                )
            }
        )
    )
admin.site.register(UserTrainer, CustomUserAdmin)
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('article', 'slug','trainer')
    list_display_links = ('article',)
    fields = ('article', 'slug', 'keywords', 'text',)
    readonly_fields = ('trainer',)

CodePudding user response:

The problem is that you are are not specifying user when you save your post, so you should override your save method in admin.py, try this (OFFICIAL DOCS):

admin.site.register(UserTrainer, CustomUserAdmin)
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('article', 'slug','trainer')
    list_display_links = ('article',)
    fields = ('article', 'slug', 'keywords', 'text',)
    readonly_fields = ('trainer',)

    def save_model(self, request, obj, form, change):
        obj.trainer = request.user
        super().save_model(request, obj, form, change)
  • Related