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)
мой файл 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')