在DjangoCMS的Aldryn Category中添加自定义字段并显示于后台
给Aldryn Categories的Category添加图片字段并在Admin显示
我刚好做过类似的需求,给你分享一下可行的解决方案——因为直接修改第三方包的模型不是长久之计(升级包时会丢失更改),我们用一对一关联模型的方式来扩展Category,同时定制Admin界面把图片字段整合进去:
步骤1:创建关联模型扩展Category
在你的app的models.py里,创建一个和Category一对一关联的模型,用来存储图片字段:
from django.db import models from aldryn_categories.models import Category from django.utils.translation import gettext_lazy as _ class CategoryImage(models.Model): # 和Category一对一绑定 category = models.OneToOneField( Category, on_delete=models.CASCADE, related_name='image', verbose_name=_('关联分类') ) # 图片字段,记得先安装Pillow库 category_image = models.ImageField( upload_to='category_images/', # 图片存储路径 verbose_name=_('分类图片'), blank=True, null=True ) class Meta: verbose_name = _('分类图片') verbose_name_plural = _('分类图片')
步骤2:定制Admin界面,整合图片字段
Aldryn Categories自带了Admin配置,我们需要继承它的CategoryAdmin,通过Inline的方式把图片字段加到原有的编辑表单里:
在你的app的admin.py中:
from django.contrib import admin from aldryn_categories.admin import CategoryAdmin as BaseCategoryAdmin from aldryn_categories.models import Category from .models import CategoryImage # 创建Inline组件,用来在Category编辑页显示图片字段 class CategoryImageInline(admin.StackedInline): model = CategoryImage can_delete = False # 因为是一对一,不允许删除 verbose_name_plural = _('分类图片') fields = ('category_image',) # 只显示图片字段 # 继承原有的CategoryAdmin,添加我们的Inline class CustomCategoryAdmin(BaseCategoryAdmin): # 把自定义的Inline加到原有的Inline列表里 inlines = BaseCategoryAdmin.inlines + [CategoryImageInline] # 先注销原有的CategoryAdmin,再注册我们自定义的版本 admin.site.unregister(Category) admin.site.register(Category, CustomCategoryAdmin)
步骤3:完成配置并测试
- 先安装图片处理依赖:
pip install pillow - 生成迁移文件:
python manage.py makemigrations - 执行迁移:
python manage.py migrate - 重启Django服务,进入Admin后台编辑Category,就能在表单下方看到图片上传的区域了!
补充说明
- 为什么不用直接修改Aldryn Categories的模型?因为第三方包升级时,你的修改会被覆盖,一对一关联是安全且可维护的扩展方式。
- 如果需要在模板中调用分类图片,可以通过
{{ category.image.category_image }}来访问(这里的image是我们在OneToOneField中设置的related_name)。
内容的提问来源于stack exchange,提问作者pinksharpii
相关产品推荐
相关产品推荐

