如何修改Django Summernote上传路径以包含用户ID?解决报错问题
Django Summernote 按用户ID组织上传路径并修复AttributeError
你遇到的AttributeError: 'Attachment' object has no attribute 'user'是因为Django-summernote默认的Attachment模型没有user字段,自定义上传路径的逻辑需要关联当前用户,从而触发了这个错误。以下是完整解决方案:
1. 自定义Attachment模型
在你的项目任意app(比如myapp)的models.py中创建自定义附件模型,继承默认模型并添加user外键:
from django.contrib.auth.models import User from django.db import models from django_summernote.models import AbstractAttachment class CustomSummernoteAttachment(AbstractAttachment): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='summernote_attachments')
2. 修正settings.py配置
更新Summernote配置,指定自定义模型,同时修正上传路径生成函数:
import os def summernote_upload_to(instance, filename): # instance为CustomSummernoteAttachment对象,可直接获取关联的user return os.path.join( 'django-summernote', f'User{instance.user.id}', filename ) SUMMERNOTE_CONFIG = { # 指定自定义附件模型,替换成你的app名 'attachment_model': 'myapp.CustomSummernoteAttachment', 'attachment_upload_to': summernote_upload_to, 'summernote': { 'attachment_filesize_limit': 200 * 1000 * 1000, 'width': '100%', 'height': '480', } }
3. 自动关联当前用户到上传附件
通过信号实现上传时自动将附件关联到当前登录用户:
在myapp/signals.py中添加信号处理:
from django.db.models.signals import pre_save from django.dispatch import receiver from django_summernote.views import SummernoteUploadAttachment from .models import CustomSummernoteAttachment @receiver(pre_save, sender=CustomSummernoteAttachment) def set_attachment_user(sender, instance, **kwargs): if not instance.user_id: # 从Summernote上传视图中获取当前请求 request = SummernoteUploadAttachment().request if request and request.user.is_authenticated: instance.user = request.user
然后在myapp/apps.py中注册信号:
from django.apps import AppConfig class MyAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'myapp' def ready(self): import myapp.signals
4. 迁移数据库
执行命令更新数据库结构:
python manage.py makemigrations python manage.py migrate
完成以上步骤后,用户上传的媒体文件就会按ProjectName/media/django-summernote/User{用户ID}/文件名的路径存储,同时不会再触发AttributeError。
内容的提问来源于stack exchange,提问作者Nicolaesse
相关产品推荐
相关产品推荐

