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

如何在Django中实现仅显示当前用户上传的文档?

实现Django用户仅查看自身上传文档的方案

1. 给文档模型添加用户外键关联

先在你的models.py里,给文档模型新增一个外键字段,关联Django内置的User模型,让每篇文档都能记录上传它的用户:

from django.db import models
from django.contrib.auth.models import User

class Document(models.Model):
    title = models.CharField(max_length=200)
    file = models.FileField(upload_to='documents/')
    upload_time = models.DateTimeField(auto_now_add=True)
    # 新增关联用户的外键
    user = models.ForeignKey(User, on_delete=models.CASCADE)

修改完模型后,执行数据库迁移命令:

python manage.py makemigrations
python manage.py migrate

如果你的表已有旧数据,迁移时会提示设置默认值,临时可填default=1(对应admin用户ID),之后记得手动把旧文档关联到对应用户,或者根据实际情况调整。

2. 上传文档时自动关联当前登录用户

不管用函数视图还是类视图,都要在保存文档时把当前登录用户绑定到文档的user字段:

  • 函数视图示例:
from django.shortcuts import render, redirect
from .forms import DocumentForm
from .models import Document

def upload_document(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            # 先不提交到数据库,手动添加用户
            doc = form.save(commit=False)
            doc.user = request.user
            doc.save()
            return redirect('document_list')
    else:
        form = DocumentForm()
    return render(request, 'upload.html', {'form': form})
  • 类视图(CreateView)示例:
from django.views.generic.edit import CreateView
from .models import Document
from .forms import DocumentForm

class DocumentCreateView(CreateView):
    model = Document
    form_class = DocumentForm
    success_url = '/documents/'

    def form_valid(self, form):
        # 给表单实例绑定当前用户
        form.instance.user = self.request.user
        return super().form_valid(form)

3. 列表查询时只返回当前用户的文档

在展示文档列表的视图里,过滤出当前登录用户的文档,阻止用户查看他人内容:

  • 函数视图示例:
def document_list(request):
    # 只查询当前用户的文档
    documents = Document.objects.filter(user=request.user)
    return render(request, 'document_list.html', {'documents': documents})
  • 类视图(ListView)示例:
from django.views.generic.list import ListView
from .models import Document

class DocumentListView(ListView):
    model = Document
    template_name = 'document_list.html'
    context_object_name = 'documents'

    def get_queryset(self):
        # 重写查询方法,只返回当前用户的文档
        return Document.objects.filter(user=self.request.user)

4. 模板渲染(无需额外修改)

模板里正常循环渲染documents即可,因为查询集已经是过滤后的当前用户数据:

<ul>
{% for doc in documents %}
    <li>{{ doc.title }} - {{ doc.upload_time }} <a href="{{ doc.file.url }}">下载</a></li>
{% endfor %}
</ul>

内容的提问来源于stack exchange,提问作者Sahil Deshpande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:25:29