Python, django, отображение правильного имени поля по FK, связанные таблицы

файл models.py

#create class roles, id, portal_name, role_name
class Roles(models.Model):
    portal_name = models.CharField(_('Portal name'), max_length=100)
    role_name = models.CharField(_('Role_name'), max_length=50)


#create permission for roles
class RolePermission(models.Model):
    module_name = models.CharField(_('Module name'), max_length=100)
    module_delete = models.BooleanField(default=False, help_text="Delete module. Default false, can't delete")
    module_edit = models.BooleanField(default=False, help_text="Edit module. Default false, can't edit")
    module_create = models.BooleanField(default=False, help_text="Create module. Default false, can't create")
    module_submit = models.BooleanField(default=False, help_text="Submit module, Default false.")
    module_role_id = models.ForeignKey('Roles', on_delete=models.CASCADE)

enter image description here

enter image description here

мой файл admin.py

@admin.register(RolePermission)
class RolePermissionAdmin(admin.ModelAdmin):
    list_display = ('module_name', 'module_role_id_id', 'module_delete', 'module_edit', 'module_create', 'module_submit')

как в столбце отображения информации о role_name из таблицы roles, используется Foreign Key

Вы можете определить метод и использовать имя этого метода в list_display. Для данного конкретного случая мы используем role_name связанного .module_role_id:

@admin.register(RolePermission)
class RolePermissionAdmin(admin.ModelAdmin):
    list_display = ('module_name', 'role_name', 'module_delete', 'module_edit', 'module_create', 'module_submit')

    @admin.display(description='role name')
    def role_name(self, obj):
        return obj.module_role_id.role_name

Примечание: Обычно не добавляют суффикс _id к полю ForeignKey, так как Django автоматически добавит поле-"близнец" с суффиксом _id. Поэтому он должен быть module_role, вместо module_role_id.

.

Вы можете создать новое свойство и использовать его в list_display, оно должно быть таким :

class RolePermission(models.Model):
    module_name = models.CharField(_('Module name'), max_length=100)
    module_delete = models.BooleanField(default=False, help_text="Delete module. Default false, can't delete")
    module_edit = models.BooleanField(default=False, help_text="Edit module. Default false, can't edit")
    module_create = models.BooleanField(default=False, help_text="Create module. Default false, can't create")
    module_submit = models.BooleanField(default=False, help_text="Submit module, Default false.")
    module_role_id = models.ForeignKey('Roles', on_delete=models.CASCADE)
    
    def  module_role(self):
        return self.module_role_id.role_name

и ваш list_display должен выглядеть следующим образом:

    list_display = ('module_name', 'module_role', 'module_delete', 'module_edit', 'module_create', 'module_submit')
Вернуться на верх