在Django admin中以只读方式显示模型字段

时间:2017-09-08 19:44:41

标签: python django

我想在django用户个人资料编辑页面中显示一个模型字段,即module_name只读。模型Categorymanytomany模型有Profile的关系。

Category

id   category_name module_name
1    A             X
2    B             Y

profile_category

id    profile_id    category_id
1     2             1

所以对于例如。当我在管理页面上编辑2的用户ID时,如果将类别ID X分配给用户ID 1,我希望显示模块名称2 }

models.py

class Category(models.Model):
    category_name = models.CharField(max_length=150, blank=False, null=True, default="", unique=True)
    module_name = models.TextField(blank=False, null=True)

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name ='profile')
    phone_number = PhoneNumberField( blank=True, null=True)
    organisation = models.CharField(max_length=30, blank=True)
    category = models.ManyToManyField(Category)

admin.py

class ProfileInline(admin.StackedInline):
    model = Profile
    filter_horizontal = ('category',)

class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )
    list_select_related = ( 'profile',  )

如果可能,请建议。

非常感谢任何帮助/建议。提前谢谢。

1 个答案:

答案 0 :(得分:2)

方法1

使用继承自O(n)的{​​{3}}。

admin.BaseModelAdmin

方法2

对于class ProfileInline(admin.StackedInline): model = Profile readonly_fields = ('module_names',) def module_names(self, instance): # Write a get-method for a list of module names in the class Profile # return HTML string which will be display in the form return format_html_join( mark_safe('<br/>'), '{}', ((line,) for line in instance.get_module_names()), ) or mark_safe("<span>The user belongs to no category</span>") # short_description functions like a model field's verbose_name module_names.short_description = "Module names" 网站的旧版本,您可以挂钩admin get_fieldsets方法。这个方法发布了readonly_fields,有一个很好的例子。