You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:07:41